在触发器中,如何检查是否没有字段发生变化?

And*_*ton 5 trigger sql-server

如果我们收到一条不检查 where 子句中的值是否已更改的更新语句,那么在触发器中忽略该更新的不同方法是什么?

我知道我们可以对每个单独的字段进行比较(也可以处理 ISNULL 端),但是如果它是一个包含 50 多个字段的表,是否有更快/更简单的方法来做到这一点?

注意:这可用于减少审计记录等中的 IO/噪音...

例子

对于表:

CREATE TABLE myTest
(ID int NOT NULL IDENTITY(1,1), 
 Field1 varchar(10) NULL,
 Field2 varchar(20) NULL)
Run Code Online (Sandbox Code Playgroud)

带有更新程序后触发器,其中包含:

INSERT INTO myTestAudit (ID, Field1, Field2, DateTimeUpdate)
SELECT ID, Field1, Field2, getDate()
FROM inserted
Run Code Online (Sandbox Code Playgroud)

初始值:

INSERT INTO myTest (Field1, Field2)
SELECT 'a', 'b' UNION ALL
SELECT 'a', 'c'
Run Code Online (Sandbox Code Playgroud)

现在运行更新:

UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 5

要恢复至少一个值已更改的行,您可以使用

SELECT /*TODO: Column List*/
FROM   INSERTED I
       JOIN DELETED D
         ON I.ID = D.ID
            AND EXISTS (SELECT I.*
                        EXCEPT
                        SELECT D.*)  
Run Code Online (Sandbox Code Playgroud)