小编典典

如何检查INSTEAD OF UPDATE触发器中是否正在更新列

sql

我对基于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的示例)将不胜感激!


阅读 223

收藏
2021-03-23

共1个答案

小编典典

使用测试,您可以检查 触发特定的列是否被更新(再采取具体行动),但你不能有一个触发 火灾
仅在特定列的更新。无论更新的目标是哪一列,它都会在执行更新后立即触发。UPDATE( _columnname_ )

因此,如果您认为必须使用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
2021-03-23