SQL Server触发器切换插入,删除,更新

时间:2009-11-17 20:58:03

标签: sql-server triggers dml

Hello可以在Trigger Body上的DML命令/操作(插入,删除,更新)之间切换吗?我尝试将一些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

谢谢,

5 个答案:

答案 0 :(得分:19)

我将向您展示一种在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

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

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

(如果您想要更多理由避免MERGEread this。)

答案 1 :(得分:7)

您可以使用inserted and deleted tables查看对表格所做的更改。

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

DELETE和INSERT使用他们自己的表格。

答案 2 :(得分:6)

您可以有三个单独的触发器,一个用于INSERT,一个用于UPDATE,一个用于DELETE。由于每个触发器都不同,因此不需要切换逻辑。

答案 3 :(得分: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 :(得分:0)

您可以通过使用union join对所有命令/操作使用一个触发器;

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

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