INSTEAD OF UPDATE触发器 - 这可能吗?

big*_*gtv 13 sql sql-server sql-server-2000

我正在对构建在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
Run Code Online (Sandbox Code Playgroud)

如果是这样的例子(SQL 2000兼容)将非常感谢!

And*_*y M 14

使用测试,您可以检查触发特定的列是否被更新(再采取具体行动),但你不能有一个触发火灾仅在特定列的更新.一旦执行更新,它将立即触发,无论哪个列是更新的目标.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
Run Code Online (Sandbox Code Playgroud)