如果我们收到一条更新语句,它不检查 where 子句中的值是否已更改,那么在触发器中忽略该更新的不同方法是什么?
我知道我们可以对每个单独的字段进行比较(也处理 ISNULL 端),但是如果它是一个有 50 多个字段的表,有没有更快/更简单的方法呢?
注意:这可用于减少审计记录等中的 IO/噪音...
例子
对于以下表格:
CREATE TABLE myTest
(ID int NOT NULL IDENTITY(1,1),
Field1 varchar(10) NULL,
Field2 varchar(20) NULL)
带有更新后触发器,其中包含:
INSERT INTO myTestAudit (ID, Field1, Field2, DateTimeUpdate)
SELECT ID, Field1, Field2, getDate()
FROM inserted
具有初始值:
INSERT INTO myTest (Field1, Field2)
SELECT 'a', 'b' UNION ALL
SELECT 'a', 'c'
现在运行更新:
UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
要恢复至少一个值已更改的行,您可以使用
将此作为触发器的第一行:
我在所有审计触发器中都这样做。它很简短,而且明确地减少了浪费的 I/O。
更新:对不起,我误读了你的问题。我以为您问如果没有数据更改,如何退出触发器。