我对基于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的示例)将不胜感激!
使用测试,您可以检查 在 触发特定的列是否被更新(再采取具体行动),但你不能有一个触发 火灾 仅在特定列的更新。无论更新的目标是哪一列,它都会在执行更新后立即触发。UPDATE( _columnname_ )
UPDATE( _columnname_ )
因此,如果您认为必须使用INSTEAD OF UPDATE触发器,则需要在其中实现两种动作:
INSTEAD OF UPDATE
1)在更新时(或更确切地说,更新 并 设置为)插入到tbDeletedUsers+从中删除;tbUsers``IsDeleted __1
tbDeletedUsers
tbUsers``IsDeleted
1
2)tbUsers正常更新-IsDeleted未更新(或已更新但未设置为1)的时间。
tbUsers
IsDeleted
因为可以用一条UPDATE指令更新多个行,所以您可能还需要考虑到某些行可能已IsDeleted设置为,1而另一些行未设置为。
UPDATE
我不是INSTEAD OF触发器的忠实拥护者,但是如果我真的必须使用触发器来执行像您这样的任务,那么我可能会省略UPDATE()测试并实现触发器,如下所示:
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