如何在 SQL 服务器中编写触发器 body
How to write trigger body in SQL Server
我很困惑 SQL 服务器中的触发器如何知道什么事件触发了触发器以及要做什么。
例如,我有一个在 table A 上更新的触发器,它正在执行 AFTER INSERT, DELETE, UPDATE
。现在我的问题是如何让 body 在触发时执行每个任务,我是否需要为每个任务单独触发,或者它是否是一种指定它需要为单个任务执行的操作的方法 body 和一个触发器。如果可以的话,任何人body都可以给出一些解释和例子吗
谢谢
如果你真的必须做一个单一的触发器 - 这是保持三个操作所需的逻辑 - 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
伪表可能 包含多行 - 以 set-based 方式处理它们 ,作为表 - 不要这样做任何像
SELECT @ID = i.ID FROM Inserted i
对于在单个 SQL 语句中一次插入多行,这将 不起作用 !
但正如我所说 - 这有点混乱,导致触发器非常大,并且难以维护此代码。我个人 更愿意 有三个独立的、有针对性的触发器 - 一个用于您需要处理的每个操作。
我很困惑 SQL 服务器中的触发器如何知道什么事件触发了触发器以及要做什么。
例如,我有一个在 table A 上更新的触发器,它正在执行 AFTER INSERT, DELETE, UPDATE
。现在我的问题是如何让 body 在触发时执行每个任务,我是否需要为每个任务单独触发,或者它是否是一种指定它需要为单个任务执行的操作的方法 body 和一个触发器。如果可以的话,任何人body都可以给出一些解释和例子吗
谢谢
如果你真的必须做一个单一的触发器 - 这是保持三个操作所需的逻辑 - 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
伪表可能 包含多行 - 以 set-based 方式处理它们 ,作为表 - 不要这样做任何像
SELECT @ID = i.ID FROM Inserted i
对于在单个 SQL 语句中一次插入多行,这将 不起作用 !
但正如我所说 - 这有点混乱,导致触发器非常大,并且难以维护此代码。我个人 更愿意 有三个独立的、有针对性的触发器 - 一个用于您需要处理的每个操作。