- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在对构建在 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
最佳答案
使用 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/
我是一名优秀的程序员,十分优秀!