这是我的(进行中)触发器。
ALTER TRIGGER [dbo].[trgInsertUpdate]
ON [dbo].[joinreason]
AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @jr_active AS char(1), @jrid AS int;
SELECT @jr_active = (SELECT jr_active FROM INSERTED)
SELECT @jrid = (SELECT jrid FROM INSERTED)
IF UPDATE(jr_active)
BEGIN
IF (jr_active = 'N')
BEGIN
UPDATE joinreason
SET jr_active = 'N' where jr_par_jrid = jrid;
END
END
END
jr_active列是' Y'或者' N' 业务要求是:
当记录没有jr_par_id时,它被视为父记录。
当记录有jr_par_id时,它被视为孩子。
当父母的jr_active列从' Y'更改时到了' N':
我无法理解如何引用旧值(更新后更改的值)和新值(要更新的值)。
谁能看到我哪里出错了?
使用SQL Server 2008
答案 0 :(得分:2)
更新后触发的触发器可以访问两个虚拟表:inserted
,其中包含已更改行的新更新版本,deleted
包含更改后的旧版本(更新前)行。要让触发器检测行是否已更改,您需要连接两个虚拟表并比较感兴趣的值。
我相信这个触发器就是你想要的:
CREATE TRIGGER [dbo].[trgInsertUpdate]
ON [dbo].[joinreason]
AFTER INSERT, UPDATE
AS
BEGIN
IF UPDATE(jr_active)
BEGIN
UPDATE joinreason
SET jr_active = 'N'
FROM joinreason j
JOIN inserted i ON i.jrid = j.jr_par_jrid
JOIN deleted d ON i.jrid = d.jrid
WHERE d.jr_active = 'Y' AND i.jr_active = 'N'
END
END
与inserted
虚拟表的联接限制了对子项的更新,并且使用deleted
的联接过滤掉jr_active
从Y
更改为{的{父}行{1}}。
如果你想测试它,我的测试代码可以在这里找到:http://pastebin.com/GzVjX4dT