更新时的SQL触发器-某些表列

时间:2019-10-07 18:11:01

标签: sql sql-server triggers sql-update

我需要设置一个触发器,以将修改后的日期更新为当前日期和时间,但前提是必须更改用户名或密码。这些是第四列和第五列。

我使用了该线程中的技巧来尝试触发。现在,我只想填写一个日志表,所以我可以测试它是否正常工作。最终,我将把插入内容转换为更新语句中的日志,以更新修改后的日期:SQL update trigger only when column is modified

CREATE TRIGGER dbo.updUserData 
ON tblUserInfo
AFTER UPDATE 
AS  
    DECLARE @USR VARCHAR(8000)
    DECLARE @PW VARCHAR(8000)

    IF (COLUMNS_UPDATED() & 25) > 0
    BEGIN
        SELECT @USR = UI.UserName 
        FROM .[dbo].[tblUserInfo] UI
        INNER JOIN Inserted I ON UI.ID = I.ID 
        WHERE UI.UserName <> I.UserName

        SELECT @PW = EC.Password 
        FROM [dbo].[tblUserInfo] UI
        INNER JOIN Inserted I ON UI.ID = I.ID 
        WHERE UI.Password <> I.Password

        INSERT INTO logs
        VALUES ('USERNAME ' + @USR + 'OR PASSWORD CHANGED ' + @Pw) 
    END

当我修改第4列或第5列时,我在日志表中获得了一条新记录,但字符串为NULL。它不是在插入字符串,而是在仅更改那两列之一时才创建NULL记录的限制。这足以让我知道它正在捕获正确的活动,但是我想看看是否可以使它正常工作,并将实际的字符串插入到日志表中,因为我认为这对我来说是个很好的练习。

如果有人可以帮助我在终点线上解决问题,我将非常乐意提供帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

为什么不使用insert . . . select

INSERT INTO logs (<name the column here>)
    SELECT 'USERNAME ' + i.username + 'OR PASSWORD CHANGED ' + i.password
    FROM inserted i JOIN
         deleted d
         ON i.id = d.id
    WHERE i.username <> d.username OR
          i.password <> d.password;