如何在SQL Server中编写触发器主体

问题描述

我很困惑sql Server中的触发器如何知道哪个事件触发了触发器以及该怎么做。

例如,我有一个在表A上更新的触发器,它正在执行AFTER INSERT,DELETE,UPDATE。现在,我的问题是,如何使主体在触发每个任务时执行任务,我是否需要为每个任务创建单独的触发器,或者这是在单个主体和单个触发器上指定每个任务需要执行的操作的方式。如果可以的话,任何人都可以给它一些解释和例子

谢谢

解决方法

如果您确实必须执行一次触发器-这是将INSERTUPDATEDELETE这三个操作分开的逻辑:

CREATE TRIGGER dbo.YourTriggerName
ON dbo.YourTable
AFTER DELETE,INSERT,UPDATE
AS
BEGIN
    -- check if both the Inserted as well as the Deleted pseudo tables exist
    IF EXISTS (SELECT * FROM Inserted) AND EXISTS (SELECT * FROM Deleted)
    BEGIN
        -- trigger operation : UPDATE
        -- "Inserted" contains the new values for the rows after the update
        -- "Deleted" contains the old values for the rows before the update
    END

    -- check if only the Inserted pseudo tables exists
    IF EXISTS (SELECT * FROM Inserted) AND NOT EXISTS (SELECT * FROM Deleted)
    BEGIN
        -- trigger operation: INSERT
        -- "Inserted" contains the values for the rows inserted 
    END

    -- check if only the Deleted pseudo tables exists
    IF NOT EXISTS (SELECT * FROM Inserted) AND EXISTS (SELECT * FROM Deleted)
    BEGIN
        -- trigger operation: DELETE
        -- "Deleted" contains the values for the rows having been deleted
    END
END;

请注意::触发器被称为每条语句一次-每行不会一次-因此InsertedDeleted伪表将可能包含多行-以基于集合的方式处理它们,就像表格一样-不要做类似的事情

SELECT @ID = i.ID FROM Inserted i

对于在单个SQL语句中一次插入多个行,这将不起作用

但是,正如我所说的那样,这有点混乱,这会导致非常大的触发,并且很难维护此代码。我个人会宁愿有三个单独的,有针对性的触发器-一个用于您需要处理的每个操作。