我需要设置一个触发器,以将修改后的日期更新为当前日期和时间,但前提是必须更改用户名或密码。这些是第四列和第五列。
我使用了该线程中的技巧来尝试触发。现在,我只想填写一个日志表,所以我可以测试它是否正常工作。最终,我将把插入内容转换为更新语句中的日志,以更新修改后的日期: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记录的限制。这足以让我知道它正在捕获正确的活动,但是我想看看是否可以使它正常工作,并将实际的字符串插入到日志表中,因为我认为这对我来说是个很好的练习。
如果有人可以帮助我在终点线上解决问题,我将非常乐意提供帮助。
谢谢。
答案 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;