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

时间:2012-03-24 14:09:06

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

我正在对构建在SQL Server 2000上的遗留应用程序进行一些调整,不用说我只想做到绝对最小,因为担心它可能会崩溃。

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

移动当前删除的用户是直截了当的,但我想要一种方法来移动设置了IsDeleted标志的任何未来用户。我可以在列上使用标准的AFTER触发器,但是我计划在tbUser表中添加一些违反此规则的约束,我想要的是我的INSTEAD OF UPDATE触发器触发并将记录移动到存档表中吗? / p>

我想我的问题是......是否有可能在更新单个列时触发INSTEAD OF UPDATE触发器?这就是我到目前为止所做的:

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

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

1 个答案:

答案 0 :(得分:14)

使用UPDATE(columnname)测试,您可以检查 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 测试并实现这样的触发器:< / p>

{{1}}