插入更新触发器如何确定是否插入或更新
我需要在表A上编写一个Insert,Update Trigger,它将删除表B中所有行,其中一列(称为Desc)具有类似于表A的列(例如Col1)中插入/更新的值。 我将如何去写它,以便我可以处理更新和插入案例。 我将如何确定是否为更新或插入执行触发器。
如果它是MS SQL Server ...
触发器有特殊的INSERTED
和DELETED
表来跟踪“之前”和“之后”数据。 所以你可以使用IF EXISTS (SELECT * FROM DELETED)
来检测更新。 在更新时只有DELETED
行,但INSERTED
中总是有行。
在CREATE TRIGGER中查找“插入”
编辑,2011年11月23日
评论之后,此答案仅适用于INSERTED
和UPDATED
触发器。
显然,如上所述,DELETE触发器不能“在INSERTED
总是行”
CREATE TRIGGER dbo.TableName_IUD
ON dbo.TableName
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
--
-- Check if this is an INSERT, UPDATE or DELETE Action.
--
DECLARE @action as char(1);
SET @action = 'I'; -- Set Action to Insert by default.
IF EXISTS(SELECT * FROM DELETED)
BEGIN
SET @action =
CASE
WHEN EXISTS(SELECT * FROM INSERTED) THEN 'U' -- Set Action to Updated.
ELSE 'D' -- Set Action to Deleted.
END
END
ELSE
IF NOT EXISTS(SELECT * FROM INSERTED) RETURN; -- Nothing updated or inserted.
...
END
如果您运行删除语句并不会删除任何内容,则其中许多建议不会考虑在内。
假设您尝试删除ID等于表中不存在的某个值的位置。
你的触发器仍然被调用,但在Deleted或Inserted表中没有任何内容。
使用这个是安全的:
--Determine if this is an INSERT,UPDATE, or DELETE Action or a "failed delete".
DECLARE @Action as char(1);
SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED)
AND EXISTS(SELECT * FROM DELETED)
THEN 'U' -- Set Action to Updated.
WHEN EXISTS(SELECT * FROM INSERTED)
THEN 'I' -- Set Action to Insert.
WHEN EXISTS(SELECT * FROM DELETED)
THEN 'D' -- Set Action to Deleted.
ELSE NULL -- Skip. It may have been a "failed delete".
END)
特别感谢@KenDog和@Net_Prog的答案。
我从他们的脚本构建了这个。
上一篇: Insert Update trigger how to determine if insert or update