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)
归档时间: |
|
查看次数: |
41330 次 |
最近记录: |