我需要在表A上编写一个Insert,Update触发器,它将删除表B中的所有行,这些行的一列(比如Desc)的值类似于表A的列(比如Col1)中插入/更新的值。我该如何编写它才能处理Update和Insert两种情况?如何确定触发器是为update还是insert执行的。
发布于 2009-04-12 08:03:24
触发器有特殊的INSERTED
和DELETED
表来跟踪“之前”和“之后”的数据。所以你可以使用像IF EXISTS (SELECT * FROM DELETED)
这样的东西来检测更新。在update时,您只在DELETED
中有行,但在INSERTED
中总是有行。
在CREATE TRIGGER中查找"inserted“。
编辑,2011年11月23日
注释之后,此答案仅适用于INSERTED
和UPDATED
触发器。
显然,DELETE触发器不能像我上面所说的那样具有“INSERTED
中的所有行”
发布于 2011-09-15 19:53:58
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
发布于 2012-06-07 16:18:35
如果运行不删除任何内容的delete语句,则不会考虑其中的许多建议。
假设您尝试删除ID等于表中不存在的某个值的位置。
您的触发器仍然会被调用,但删除或插入的表中没有任何内容。
为了安全起见,请使用以下代码:
--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的回答。
这是我从他们的脚本中构建的。
https://stackoverflow.com/questions/741414
复制相似问题