【问题标题】:SQL Server Trigger switching Insert,Delete,UpdateSQL Server 触发器切换插入、删除、更新
【发布时间】:2010-12-17 15:02:34
【问题描述】:

您好可以在触发器主体上的 DML 命令/操作(插入、删除、更新)之间切换吗?我尝试 sn-p 一些 T-SQL 以更好地理解我:

CREATE TRIGGER DML_ON_TABLEA
   ON  TABLEA
   AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    CASE 
    WHEN (INSERT) THEN
        -- INSERT ON AUX TABLEB 
    WHEN (DELETE) THEN
        -- DELETE ON AUX TABLEB 
    ELSE --OR WHEN (UPDATE) THEN
        -- UPDATE ON AUX TABLEB 
    END
END
GO

谢谢,

【问题讨论】:

    标签: sql-server triggers dml


    【解决方案1】:

    我将向您展示一种在 SQL Server 2000 或 2005 中检查这一点的简单方法(您忘记提及您使用的是哪个版本),但总的来说,我同意 Remus 的观点,即您应该将它们分解为单独的触发器:

    DECLARE @i INT, @d INT;
    SELECT @i = COUNT(*) FROM inserted;
    SELECT @d = COUNT(*) FROM deleted;
    IF @i + @d > 0
    BEGIN
        IF @i > 0 AND @d = 0
        BEGIN
            -- logic for insert
        END
    
        IF @i > 0 AND @d > 0
        BEGIN
            -- logic for update
        END
    
        IF @i = 0 AND @d > 0
        BEGIN
            -- logic for delete
        END
    END
    

    请注意,由于MERGE 在 SQL Server 2008 中引入的复杂性,这可能无法完全向前兼容。有关详细信息,请参阅此连接项:

    因此,如果您计划将来使用 SQL Server 2008 和MERGE,那么这更有理由将触发器拆分为每种 DML 操作类型的触发器。

    (如果您想有更多理由避免使用MERGEread thisthis。)

    【讨论】:

    • +1 表示“拆分触发器的更多理由”。这确实节省了很多时间,而且只是“有道理”——当单独的触发器也能完成工作时,为什么还要费心去弄清楚需要做什么。谢谢@Aaron。
    • 这是 Aaron 提到的 Microsoft Connect(现已停用)项目的链接:connect.microsoft.com:80/SQLServer/feedback/details/321930/…
    • @MarkVarnas 我更新了网址。你现在必须通过 WayBack 机器。
    【解决方案2】:

    您可以通过使用联合连接将一个触发器用于所有命令/操作;

    CREATE TRIGGER DML_ON_TABLEA
     ON  TABLEA
    AFTER INSERT,DELETE,UPDATE
    AS 
    BEGIN
        SET NOCOUNT ON;
       --logic for insert
        insert into Backup_table (columns_name) select columns_name from inserted i
        --logic for delete
       UNION ALL
        insert into Backup_table (columns_name) select columns_name from deleted d
    END
    GO
    

    --注意更新命令,如插入命令,但删除另一个命令

    【讨论】:

      【解决方案3】:

      我认为执行此操作的一般方法是为每个操作创建一个触发器,如下所示:

      CREATE TRIGGER INSERT_ON_TABLEA   
      ON  TABLEA   
      AFTER INSERT 
      AS 
      BEGIN    
      SET NOCOUNT ON;    
      -- INSERT ON AUX TABLEB
      END
      GO
      
      CREATE TRIGGER DELETE_ON_TABLEA   
      ON  TABLEA   
      AFTER DELETE
      AS 
      BEGIN    
      SET NOCOUNT ON;    
      -- DELETE ON AUX TABLEB
      END
      GO
      

      【讨论】:

        【解决方案4】:

        您可以使用inserted and deleted tables 查看对表格进行了哪些更改。

        对于 UPDATE,deleted 表包含行的旧版本,inserted 包含新版本。

        DELETE 和 INSERT 使用它们自己的表,正如您所期望的那样。

        【讨论】:

          【解决方案5】:

          您可以拥有三个独立的触发器,一个用于 INSERT,一个用于 UPDATE,一个用于 DELETE。由于每个触发器都不一样,所以不需要切换逻辑。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-19
            • 2011-11-25
            • 1970-01-01
            • 2011-05-05
            • 2011-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多