如果我们收到一条更新语句,该语句不检查 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。

更新:抱歉,我误读了你的问题。我以为您问的是如果没有数据更改,如何退出触发器。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top