SQL触发旧值和新值的问题

时间:2015-03-13 14:19:42

标签: sql sql-server database sql-server-2008 triggers

这是我的(进行中)触发器。

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时,它被视为孩子。

  1. 孩子的jr_par_id = =父
  2. 的jrid

    当父母的jr_active列从' Y'更改时到了' N':

    1. 所有儿童都应该更新为N' N'在jr_active列中
    2. 我无法理解如何引用旧值(更新后更改的值)和新值(要更新的值)。

      谁能看到我哪里出错了?

      使用SQL Server 2008

1 个答案:

答案 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_activeY更改为{的{父}行{1}}。

如果你想测试它,我的测试代码可以在这里找到:http://pastebin.com/GzVjX4dT