gpt4 book ai didi

sql - 如何在 INSTEAD OF UPDATE 触发器中检查列是否正在更新

转载 作者:行者123 更新时间:2023-12-04 11:18:41 25 4
gpt4 key购买 nike

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

我有一个很大的用户表 tbUsers,带有一个用于 IsDeleted 的 BIT 标志。我想将所有当前和 future 的 IsDeleted = 1 用户记录归档到我的归档表 tbDeletedUsers 中。

移动当前删除的用户很简单,但是我想要一种方法来移动设置了 IsDeleted 标志的任何 future 用户。我可以在列上使用标准的 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) 测试,您可以检查触发器是否更新了特定列(然后执行特定操作),但不能仅在特定列更新时触发触发器。它会在执行更新后立即触发,无论哪个列是更新的目标。

因此,如果您认为必须使用 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

关于sql - 如何在 INSTEAD OF UPDATE 触发器中检查列是否正在更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9852394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com