[英]SQL Server trigger to check if column value was changed to insert
我大約有25個表,每個表都有3個觸發器(插入,更新,刪除)以生成有關用戶操作的日志。 每次在UI中進行編輯時,所有這些表都會更新,盡管它們的值不會在UI中更改。
在這種情況下,我不能只檢查是否更新了列,還需要檢查以前的更新值是否與新更新的值不同,以便可以將其插入到日志表中。 另外,我需要將所有更新的表值插入到日志表中,以逗號分隔的字符串形式。
有什么有效的方法來解決這個問題嗎?
ALTER TRIGGER [dbo].[Activity_Update]
ON [dbo].[Activity]
AFTER UPDATE
AS
BEGIN
DECLARE @Names VARCHAR(8000)
SET @result = ' '
DECLARE @id INT;
SELECT @id = i.ID FROM inserted i;
IF UPDATE(deptNotes)
BEGIN
DECLARE @OldValue NVARCHAR(MAX)
SELECT TOP 1 @OldValue = deptNotes
FROM Activity
WHERE id = @id
ORDER BY Timestamp DESC
IF (@OldValue != (SELECT i.deptNotes FROM inserted i))
BEGIN
IF ((SELECT i.deptNotes FROM inserted i) != ' ')
SELECT @result = @result + ',' + 'Modified dept. Notes'
ELSE
SELECT @result = @result + ',' + 'Removed dept. Notes'
END
END
IF UPDATE(deptActivityID)
BEGIN
DECLARE @OldValue1 NVARCHAR(MAX)
SELECT TOP 1 @OldValue1 = deptActivityID
FROM Activity
WHERE id = @id
ORDER BY Timestamp DESC
IF (@OldValue1 != (SELECT i.deptActivityID FROM inserted i))
BEGIN
SELECT @result = @result + ',' + 'Changed dept. Activity '
END
END
IF UPDATE(SubmissionDate)
BEGIN
declare @OldValue2 nvarchar(max)
select Top 1 @OldValue2 = submissiondate from [Activity] where id=@id Order by Timestamp DESC
If (@OldValue2 != (select i.submissiondate from inserted i))
BEGIN
Select @result = @result + ',' + 'Changed application date - ' + '"' + (select cast(i.submissiondate as nvarchar(500)) from inserted i)+ '"'
END
END
INSERT [Activity]
(
[deptActivityID],
[deptNotes],
[SubmissionDate],
[Username],
[Operation],
[Comment]
)
SELECT
v.deptActivityID,
v.deptNotes,
v.SubmissionDate,
v.[LastEditBy],
'update',
@result
FROM inserted v
END
GO
您可以使用deleted
表找出舊值,然后inserted
新值。 另請注意,INSERT,UPDATE和DELETE可能影響多個行,因此您應由觸發器處理。
下面的觸發代碼將為您提供deptNotes中任何更改的行列表。
select 'deptActivityID ' + d.deptActivityID +
' Changed from ' + d.deptNotes + ' to ' + i.deptNotes
from deleted d
inner join inserted i on d.deptActivityID = i.deptActivityID
where d.deptNotes <> i.deptNotes
如果您的deptNotes可能包含NULL值,則需要使用ISNULL()來處理
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.