首页 > 解决方案 > 如何在 SQL Server 中编写触发器主体

问题描述

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

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

谢谢

标签: sql-servertriggerssql-updatesql-insertsql-delete

解决方案


如果您真的必须执行单个触发器 - 这是保持三个操作 - 和 - 分开所需INSERTUPDATE逻辑DELETE

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 语句中一次插入多行!

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


推荐阅读