问题是,有时在没有人更改任何东西的一天中,随机用户只需进入页面,触发器就会保存更改。问题是,它不仅记录了当天/时刻从未发生过的更改(因为他/她没有进行更改(,而且还从 INSERTED/DELETE 中获取随机数据,就像我们在 2019 年 5 月 5 日有一个更改日志,其更改日期设置为 2014 年,这是很久以前的事了。
我的触发器类似于下面的触发器,只是没有个人信息。我们通过在一天进行更改来模拟这个问题,然后正确触发日志,之后我们更改计算机上的日期,登录并稍等片刻,然后它记录一些随机内容。有时它需要很多时间,并进入/退出页面,但最终从很久以前的另一个日期出现一些完全随机的东西。感谢您的帮助!
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tablelog]
ON [dbo].[tablechanged]
AFTER UPDATE
AS
BEGIN
declare @OLD_DATA nvarchar(2000);
declare @NEW_DATA nvarchar(2000);
declare @Counter INT;
declare @Occurrences INT;
declare @col varchar(1000);
declare @SELECDELET nvarchar(2000);
declare @SELECINSER nvarchar(2000);
declare @user varchar(50);
declare @cod int;
declare @emp INT;
declare @isReg bit;
set @Occurrences = (SELECT COUNT(COLUMN_NAME) FROM information_schema.columns WHERE table_name = 'tablechanged')
set @Counter = 0;
set @user = (SELECT TOP 1 usuarioUltimaAlteracao FROM INSERTED);
set @emp = (SELECT TOP 1 empCodigo FROM INSERTED);
set @cod = (SELECT TOP 1 cedCodigo FROM INSERTED);
set @isReg = (SELECT TOP 1 alteracaoViaCadastro FROM INSERTED);
SELECT * INTO #Del FROM DELETED
SELECT * INTO #Ins FROM INSERTED
if(@isReg = 1)
begin
while @Counter < @Occurrences
begin
set @Counter = @Counter + 1;
set @col = (select COLUMN_NAME FROM information_schema.columns WHERE table_name = 'tablechanged' and ordinal_position = @Counter);
select @SELECDELET = 'SELECT @OLD_DATA='+@col+' FROM #Del' ;
select @SELECINSER = 'SELECT @NEW_DATA='+@col+' FROM #Ins' ;
exec sp_executesql @SELECDELET, N'@OLD_DATA nvarchar(40) OUTPUT', @OLD_DATA OUTPUT
exec sp_executesql @SELECINSER, N'@NEW_DATA nvarchar(40) OUTPUT', @NEW_DATA OUTPUT
if(@OLD_DATA <> @NEW_DATA)
begin
INSERT INTO TABLELOG (OPE_DATE,OPE_USER,OPE_TABLE,OPE_COD,OPE_EMP,OPE_FIELD,OPE,OLD_DATA,NEW_DATA)
VALUES (getdate(), @user, 'tablechanged', @cod, @emp, @col, 'UPDATE', @OLD_DATA,@NEW_DATA)
end
end
end
END
SQL Server 会为每个语句触发触发。 不是每一行。 对于多行更新的情况,您的触发器显然已损坏。
在多行更新的情况下,运行后@NEW_DATA
的值SELECT @NEW_DATA='+@col+' FROM #Ins' ;
将是 #Ins 中的最后一个值,如果没有 ORDER BY,则无法记录它来自哪一行。