我的触发器在INSERT, UPDATE and DELETE
上触发。我需要从适当的内存表(inserted, deleted
)插入,具体取决于触发触发器的操作。由于inserted
上仅INSERT
或deleted
上DELETE
填充了UPDATE
,我认为我可以执行插入操作,如果没有行且我很好。
但是,deleted
填充了两个表。我只想要UPDATE
上UPDATE(column)
的值。我尝试使用TRUE
函数测试更新,但即使在INSERT
上也会返回UPDATE
。那么,我该如何测试ALTER TRIGGER CREATE_tableAudit
ON dbo.table
FOR INSERT, UPDATE, DELETE
AS
BEGIN
IF(UPDATE([column1]))--returns true on INSERT :(
BEGIN
INSERT INTO [dbo].[tableAudit]
([column1]
,[CreateDate]
,[UpdateDate])
SELECT * from deleted --update
END
ELSE
BEGIN
--only inserted is populated on INSERT, visa-versa with DELETE
INSERT INTO [dbo].[tableAudit]
([column1]
,[CreateDate]
,[UpdateDate])
select * from inserted --insert
INSERT INTO [dbo].[tableAudit]
([column1]
,[CreateDate]
,[UpdateDate])
select * from deleted --delete
END
?
{{1}}
答案 0 :(得分:3)
要测试UPDATE,请在Inserted
和Deleted
表格中查找相同的主键值。
/* These rows have been updated */
SELECT i.PKColumn
FROM inserted i
INNER JOIN deleted d
ON i.PKColumn = d.PKColumn
答案 1 :(得分:2)
假设行的主键没有更改,您可以通过加入主键字段上的Inserted和Deleted表来查找更新的行。如果连接这两个表产生行,那么您可以安全地假设这些行已更新。
如果更新确实更改了行的主键,那么您可能最好只将其视为两个操作,即删除和插入。
答案 2 :(得分:0)
以下对于触发器非常有用: 查询中的*可以更改为仅包含要比较的字段;如果源表中的自动编号发生更改,则可以排除该自动编号。
要检查是否已插入:
if exists (Select * from inserted) and not exists(Select * from deleted)
begin
...
end
要检查是否已更新:
if exists(SELECT * from inserted) and exists (SELECT * from deleted)
begin
...
end
要检查是否已删除:
if exists(select * from deleted) and not exists(Select * from inserted)
begin
...
end