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

P.B*_*key 5 sql triggers sql-server-2000

我的扳机扣动了INSERT, UPDATE and DELETE。我需要从适当的内存表(inserted, deleted)中插入,具体取决于触发触发器的操作。由于仅inserted填充了INSERTdeleted上,DELETE我想​​我可以只进行插入,如果没有行,我就很好。

但是,UPDATE填充两个表。deleted我只想要来自on的值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
Run Code Online (Sandbox Code Playgroud)

Joh*_*soe 2

假设行的主键没有更改,您可以通过在主键字段上连接 Inserted 和 Deleted 表来查找更新的行。如果连接这两个表产生行,那么您可以放心地假设这些行已更新。

如果更新确实更改了行的主键,那么您最好将其视为两个操作:删除和插入。