【问题标题】:How to write trigger body in SQL Server如何在 SQL Server 中编写触发器主体
【发布时间】:2021-02-13 19:21:40
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您可以弄清楚触发器触发的原因是哪个操作 - 但我发现这非常烦人且难以编写(和阅读/维护)代码。我更喜欢拥有三个单独的触发器 - 每个操作一个 - 然后从一开始就非常清楚导致触发器触发的原因 - 无需猜测,无需混乱的代码.....

标签: sql-server triggers sql-update sql-insert sql-delete


【解决方案1】:

如果您真的必须执行单个触发器 - 这是保持三个操作 - INSERT、UPDATE 和 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;

注意:触发器被调用每条语句一次 - 不是每行一次 - 所以Inserted 和Deleted 伪表可能会包含多行 - 以基于集合的方式处理它们,作为表格 - 不要做类似的事情

SELECT @ID = i.ID FROM Inserted i

对于在单个 SQL 语句中同时插入多行的情况,这将不起作用!

但正如我所说 - 这有点混乱,会导致非常大的触发器,并且难以维护此代码。我个人宁可拥有三个独立的、重点突出的触发器 - 一个用于您需要处理的每个操作。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2023-03-23
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2011-04-04
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多