我正在对构建在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兼容)将非常感谢!
答案 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}}