代码之家  ›  专栏  ›  技术社区  ›  Marcelo Cantos

MSSQL:禁用一次插入的触发器

  •  16
  • Marcelo Cantos  · 技术社区  · 16 年前

    SQL Server 2005: T-SQL to temporarily disable a trigger

    但是,我不想禁用所有触发器,甚至不想禁用一批命令,只想禁用一次插入。

    我必须处理一个shop系统,在这个系统中,最初的作者将一些应用程序逻辑放入触发器(坏主意!)。只要您不尝试以原始“管理前端”以外的其他方式插入数据,该应用程序逻辑就可以正常工作。我的工作是编写一个“从登台系统导入”工具,以便准备好所有数据。当我尝试插入它时,触发器会用生成的代码覆盖现有的产品代码(而不是标识数字ID!)。若要生成代码,它将使用自动生成的插入到另一个表的ID,这样我甚至无法使用@标识来查找刚刚插入的列并用实际的产品代码更新插入的行。

    我可以采取的任何方法来避免非常尴尬的代码(在产品名称中插入一些随机字符,然后尝试查找包含随机字符的行以更新它)。

    那么:有没有一种方法可以禁用 插入

    7 回复  |  直到 7 年前
        1
  •  17
  •   kristof    16 年前

    您可能会发现以下内容很有帮助:

    Disabling a Trigger for a Specific SQL Statement or Session

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

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

        2
  •  11
  •   Steven Robbins    16 年前

    可以使用以下命令禁用表上的触发器:

    ALTER TABLE MyTable DISABLE TRIGGER ALL
    

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

    最好的方法是改变触发器本身,以便它决定是否需要运行,无论是在表上使用“insert type”标志,还是在已经存储某种类型的类型时使用其他方法。

        3
  •  5
  •   andynormancx    16 年前

    在触发器中,更改代码,使触发器的错误位仅在“insertedFromImport”为空的行上运行。插入记录时,将“insertedFromImport”设置为非空值。

        4
  •  3
  •   Clayton Hall    13 年前

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

    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
    
        5
  •  1
  •   Justin Wignall    16 年前

    您能否检查SUSER_SNAME()并仅在管理前端上下文中运行?

        6
  •  1
  •   HLGEM    16 年前

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

        7
  •  0
  •   John    16 年前

    如果使用批量插入进行插入,则可以仅为插入禁用触发器。

    我很确定大容量插入需要文件系统上的数据文件才能导入,所以不能只使用t-SQL。

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

    使用大容量导入时,默认情况下禁用触发器。

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