16

这个问题与 SQL Server 2005 非常相似:T-SQL to temporary disable a trigger

但是,我不想禁用所有触发器,甚至不想禁用一批命令,而只想禁用一个 INSERT。

我必须处理原始作者将一些应用程序逻辑放入触发器的商店系统(坏主意!)。只要您不尝试以不同于原始“管理前端”的方式插入数据,该应用程序逻辑就可以正常工作。我的工作是编写一个“从暂存系统导入”工具,所以我已经准备好所有数据。当我尝试插入它时,触发器会用生成的产品代码(不是 IDENTITY 数字 ID!)覆盖现有的产品代码。为了生成代码,它使用自动生成的插入到另一个表的 ID,因此我什至无法使用 @@IDENTITY 来查找我刚刚插入的列并使用实际的产品代码更新插入的行。

我可以采取任何方式来避免极其尴尬的代码(在产品名称中插入一些随机字符,然后尝试找到带有随机字符的行来更新它)。

那么:有没有办法为一个INSERT 禁用触发器(甚至只是一个)?

4

7 回答 7

17

您可能会发现这很有帮助:

禁用特定 SQL 语句或会话的触发器

但是,您也可能面临另一个问题。如果我正确理解您的情况,您的系统默认会自动插入产品代码(通过生成值)。现在您需要插入由某个登台系统创建的产品,并且该产品的产品代码是由登台系统创建的,您希望手动将其插入实时系统。

如果你真的必须这样做,你需要确保你的实时应用程序生成的代码不会与你手动插入的代码冲突——我假设它们是唯一的。

其他方法是允许系统生成新代码并在需要时覆盖任何相应的数据。

于 2009-01-30T14:51:30.720 回答
11

您可以使用以下方法禁用表上的触发器:

ALTER TABLE MyTable DISABLE TRIGGER ALL

但这适用于所有会话,而不仅仅是您当前的连接..这显然是一件非常糟糕的事情:-)

最好的方法是更改​​触发器本身,以便它决定是否需要运行,无论是在表上使用“插入类型”标志还是其他方式,如果您已经存储了某种类型。

于 2009-01-30T14:39:25.610 回答
5

而不是禁用触发器,您可以不更改触发器的行为。在有问题的表中添加一个新的可空列,称为“insertedFromImport”。

在触发器中更改代码,以便触发器的违规位仅在“insertedFromImport”为空的行上运行。当您将记录集“insertedFromImport”插入非空值时。

于 2009-01-30T14:36:14.633 回答
3

禁用触发器、插入、提交。

SET IDENTITY_INSERT Test ON
GO

BEGIN TRAN

DISABLE TRIGGER trg_Test ON Test

INSERT INTO Test (MyId, MyField) 
    VALUES (999, 'foo')

ENABLE TRIGGER trg_Test ON Test

COMMIT TRAN

SET IDENTITY_INSERT Test OFF
GO
于 2011-04-21T19:39:33.830 回答
1

您可以检查 SUSER_SNAME() 并仅在管理前端的上下文中运行吗?

于 2009-01-30T14:26:52.780 回答
1

我看到很多可能会造成问题的事情。首先更改触发器以考虑多个记录导入。这可能会解决您的问题。不要关闭触发器,因为它对所有人都关闭,而不仅仅是您。如果您必须在执行此操作之前将数据库置于单用户用户模式,并在非工作时间执行您的任务。

接下来,在任何情况下都不要使用@@identity 来获取刚刚插入的值!请改用 scope_identity。如果表上的触发器也插入到具有标识字段的其他表中,@@identity 将返回错误的值。如果您现在通过您的系统使用@@identity(因为我们知道您的系统有触发器),那么您绝对的首要任务必须是立即找到并更改代码中@@identity 的所有实例。如果不这样做,您可能会遇到严重的数据完整性问题。这是一个“停止所有工作,直到解决这个问题”的问题。

至于获取刚刚插入的信息,请考虑在插入过程中创建一个 batchid,然后将一个名为 batchid 的列(可以为空,因此不会影响其他插入)添加到表中。然后你可以回调你通过batchid插入的内容。

于 2009-01-30T15:27:06.000 回答
0

如果您使用 BULK INSERT 插入,则可以仅为插入禁用触发器。

我很确定批量插入需要文件系统上的数据文件才能导入,因此您不能只使用 T-SQL。

要使用 BULK INSERT,您需要 INSERT 和 ADMINISTRATOR BULK OPERATION 权限。如果您禁用触发器或约束,您还需要 ALTER TABLE 权限。

如果您使用的是 windows 身份验证,您的 windows 用户将需要从文件中读取访问权限。如果使用混合模式身份验证,则 SQl 服务器服务帐户需要从文件中读取访问权限。

使用 BULK IMPORT 导入时,默认情况下禁用触发器。

更多信息:http: //msdn.microsoft.com/en-us/library/ms188365.aspx

于 2009-01-30T15:08:01.480 回答