【问题标题】:TSQL After Update Trigger check for update on multiple columns in one IF UPDATETSQL After Update Trigger 检查一个 IF UPDATE 中多个列的更新
【发布时间】:2014-09-24 13:08:05
【问题描述】:

TSQL 中更新后触发器的基本语法是:

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 UPDATES 合二为一?: 像这样的:

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

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

【问题讨论】:

  • 另外,现在,您需要为表中的 所有 行重新计算 ColumnC,而不仅仅是那些受插入或更新操作影响的行。 ....

标签: sql sql-server tsql triggers sql-update


【解决方案1】:

评论有点长。

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

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

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 

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

【讨论】:

  • yes 计算列当然最适合这个。您的示例也回答了我对触发器的问题,谢谢!
【解决方案2】:

你可以使用COLUMNS_UPDATED:

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

只需检查您有兴趣使用按位运算符设置的任何位:

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

当然,这确实取决于列顺序,这通常是一件不好的事情,如果以后更改列顺序,它也不会崩溃。

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2016-08-25
    • 2011-10-18
    • 1970-01-01
    • 2019-04-13
    相关资源
    最近更新 更多