如何在 SQL 服务器中编写触发器 body

How to write trigger body in SQL Server

我很困惑 SQL 服务器中的触发器如何知道什么事件触发了触发器以及要做什么。

例如,我有一个在 table A 上更新的触发器,它正在执行 AFTER INSERT, DELETE, UPDATE。现在我的问题是如何让 body 在触发时执行每个任务,我是否需要为每个任务单独触发,或者它是否是一种指定它需要为单个任务执行的操作的方法 body 和一个触发器。如果可以的话,任何人body都可以给出一些解释和例子吗

谢谢

如果你真的必须做一个单一的触发器 - 这是保持三个操作所需的逻辑 - INSERT, UPDATEDELETE - 分开:

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 伪表可能 包含多行 - 以 set-based 方式处理它们 ,作为表 - 不要这样做任何像

SELECT @ID = i.ID FROM Inserted i

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

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