SQL触发器 - 如何测试操作?

时间:2011-05-18 13:56:56

标签: sql triggers sql-server-2000

我的触发器在INSERT, UPDATE and DELETE上触发。我需要从适当的内存表(inserted, deleted)插入,具体取决于触发触发器的操作。由于inserted上仅INSERTdeletedDELETE填充了UPDATE,我认为我可以执行插入操作,如果没有行且我很好。

但是,deleted填充了两个表。我只想要UPDATEUPDATE(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}}

3 个答案:

答案 0 :(得分:3)

要测试UPDATE,请在InsertedDeleted表格中查找相同的主键值。

/* 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