此问题与SQL Server 2005非常相似:T-SQL暂时禁用触发器
但是我不想禁用所有触发器,甚至不需要一批命令,而只是一个INSERT.
我必须处理一个商店系统,原作者将一些应用程序逻辑放入触发器(糟糕的主意!).只要您不尝试以与原始"管理前端"不同的方式插入数据,该应用程序逻辑就可以正常工作.我的工作是写一个"从登台系统导入"工具,所以我准备好了所有数据.当我尝试插入它时,触发器会用生成的产品代码覆盖现有的产品代码(不是IDENTITY数字ID!).要生成代码,它会将插入的自动生成ID用于另一个表,这样我甚至无法使用@@ IDENTITY查找刚插入的列,并使用实际的产品代码更新插入的行.
我可以采取任何方式避免极端笨拙的代码(将一些随机字符插入产品名称,然后尝试找到带有随机字符的行来更新它).
那么:有没有办法只为一个 INSERT 禁用触发器(甚至只有一个)?
您可能会发现这有用:
禁用特定SQL语句或会话的触发器
但是你可能还面临另一个问题.如果我了解您处于正确状态,系统会默认自动插入产品代码(通过生成值).现在您需要插入由某个登台系统创建的产品,并且对于该产品,其产品代码是由登台系统创建的,您希望手动将其插入到实时系统中.
如果你真的必须这样做,你需要确保将来你的实时应用程序生成的代码不会与你手动插入的代码冲突 - 我认为它们必须是唯一的.
其他方法是允许系统生成新代码并在需要时覆盖任何相应的数据.
您可以使用以下命令禁用表上的触发器:
ALTER TABLE MyTable DISABLE TRIGGER ALL
但这会对所有会话都有效,而不仅仅是你当前的连接..这显然是一件非常糟糕的事情:-)
最好的方法是改变触发器本身,以便它决定是否需要运行,无论是在表上使用"insert type"标志还是其他方法,如果你已经存储了某种类型的类型.
您可以不改变触发器的行为,而不是禁用触发器.在名为"insertedFromImport"的表中添加一个新的可为空的列.
在触发器中更改代码,以便触发器的违规位仅在"insertedFromImport"为空的行上运行.当您插入记录时,将"insertedFromImport"设置为非null值.