TSQL After Update Trigger检查一个IF Update中对多个列的更新



TSQL中After Update触发器的基本语法是:

CREATE TRIGGER [dbo].[triggerName]
   ON [dbo].[Table]
   AFTER UPDATE, INSERT --trigger when Update or Insert in table
AS BEGIN
    SET NOCOUNT ON;
    IF UPDATE (ColumnA) -- if ColumnA updates start
    begin
        UPDATE Table
        SET ColumnC = ColumnA + ColumnB -- recalculate Column C
    end 
    IF UPDATE (ColumnB) -- if ColumnB updates start
    begin
        UPDATE Table
        SET ColumnC = ColumnA + ColumnB -- recalculate Column C
    end 
END

现在我猜上面可以工作,但是有可能将两个IF更新合并在一起吗?:像这样:

IF UPDATE (ColumnA) OR (ColumnB) -- if ColumnA or ColumnB updates start
        begin
            UPDATE Table
            SET ColumnC = ColumnA + ColumnB -- recalculate Column C
        end 

您当然可以使用计算列,但出于好奇,我想知道您是否可以在一个触发器中一次检查多个列的更新,然后在更新后进行触发器修改。

这个注释有点长了。

UPDATE()是触发器中使用的函数。没有像if UPDATE()那样的特定语法。据我所知,触发器允许您在if语句中组合多个条件。

但是,更重要的是,阅读UPDATE()的文档。文档中使用的示例是:

IF ( UPDATE (StateProvinceID) OR UPDATE (PostalCode) )
BEGIN
    RAISERROR (50009, 16, 10)
END;

所以,使用正确的语法,你会很好:

IF UPDATE(ColumnA) OR UPDATE(ColumnB) -- if ColumnA or ColumnB updates start
    begin
        UPDATE Table
        SET ColumnC = ColumnA + ColumnB -- recalculate Column C
    end 

但是,我建议您使用计算列。

您可以使用COLUMNS_UPDATED:

返回varbinary位模式,表示表或视图中插入或更新的列。

检查你想用位运算符设置的任何位:

IF (COLUMNS_UPDATED() & CAST(0x0A as int)) != 0
begin
   --column 2 or 4 was updated
end

当然,这取决于列的顺序,这通常是一件不好的事情,如果列的顺序后来被改变,它也不会爆炸。