【问题标题】:How to check if a column is being updated in an INSTEAD OF UPDATE Trigger如何在 INSTEAD OF UPDATE 触发器中检查列是否正在更新
【发布时间】:2012-04-08 19:00:17
【问题描述】:

我正在对基于 SQL Server 2000 的遗留应用程序进行一些调整,不用说,我只想做绝对最低限度的工作,因为担心它可能会崩溃。

我有一个大的用户表 tbUsers,其中有一个 IsDeleted 的 BIT 标志。我想将所有当前和未来的 IsDeleted = 1 用户记录归档到我的归档表 tbDeletedUsers 中。

移动当前删除的用户很简单,但是我想要一种方法来移动设置了 IsDeleted 标志的任何未来用户。我可以在列上使用标准的 AFTER 触发器,但是我计划向 tbUser 表添加一些违反这一点的约束,我希望我的 INSTEAD OF UPDATE 触发器触发并将记录移动到存档表?

我想我的问题是......是否可以在更新单个列时触发 INSTEAD OF UPDATE 触发器?这是我目前所拥有的:

 CREATE TRIGGER trg_ArchiveUsers
 INSTEAD OF UPDATE ON tbUsers
 AS 
    BEGIN
      ...
    END
 GO

如果是这样一个例子(SQL 2000 兼容)将不胜感激!

【问题讨论】:

    标签: sql sql-server sql-server-2000


    【解决方案1】:

    使用UPDATE(<em>columnname</em>) 测试,您可以检查in 触发器是否更新了特定列(然后采取特定操作),但您不能让触发器触发 仅对特定列的更新。它会在执行更新后立即触发,无论哪一列是更新的目标。

    因此,如果您认为必须使用INSTEAD OF UPDATE 触发器,则需要在其中实现两种操作:

    1) 插入tbDeletedUsers + 从tbUsers 删除——当IsDeleted 更新时(或者更准确地说,更新并且设置为1);

    2) 正常更新tbUsers - 当IsDeleted 未更新(或更新但未设置为1)时。

    由于一条UPDATE 指令可以更新多个行,因此您可能还需要考虑到某些行可能将IsDeleted 设置为1,而其他行则没有。

    我不是 INSTEAD OF 触发器的忠实拥护者,但如果我真的必须将一个触发器用于像您这样的任务,我可能会省略 UPDATE() 测试并像这样实现触发器:

    CREATE TRIGGER trg_ArchiveUsers
    ON tbUsers
    INSTEAD OF UPDATE
    AS
    BEGIN
      UPDATE tbUsers
      SET
        column = INSERTED.column,
        …
      FROM INSERTED
      WHERE INSERTED.key = tbUsers.key
        AND INSERTED.IsDeleted = 0
      ;
      DELETE FROM tbUsers
      FROM INSERTED
      WHERE INSERTED.key = tbUsers.key
        AND INSERTED.IsDeleted = 1
      ;
      INSERT INTO tbDeletedUsers (columns)
      SELECT columns
      FROM INSERTED
      WHERE IsDeleted = 1
      ;
    END
    

    【讨论】:

    • UPDATES(columnName) 在 SQL Server 中不存在。相反,使用 COLUMNS_UPDATED (columnName)。 msdn.microsoft.com/en-us/library/ms186329.aspx
    • 感谢您的评论。你是对的,正如我最初写的那样,SQL Server 中没有 UPDATES() 函数,也没有 UPDATED()。它实际上被称为UPDATE()。编辑我的答案,再次感谢您提醒我注意我的错误。
    • 您似乎也弄错了,因为 COLUMNS_UPDATED() 不接受参数。它返回一个位掩码,反映受调用触发器的语句影响的所有列。我从未使用过该功能,尽管从手册中,我想我已经大致了解了如何使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多