题
如果我们收到一条更新语句,该语句不检查 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'
解决方案
为了带回至少一个值的行,可以使用的行
SELECT /*TODO: Column List*/
FROM INSERTED I
JOIN DELETED D
ON I.ID = D.ID
AND EXISTS (SELECT I.*
EXCEPT
SELECT D.*)
其他提示
将其作为触发器中的第一行:
-- Exit trigger if no data was actually modified
IF (@@ROWCOUNT = 0) return
我在所有审核触发器中都执行此操作。它简短而切题,绝对减少了浪费的 I/O。
更新:抱歉,我误读了你的问题。我以为您问的是如果没有数据更改,如何退出触发器。
不隶属于 dba.stackexchange