0
我在表中有很多字段,我试图审计任何插入 - 更新 - 在另一个表中删除。如何使用SQL触发器获取旧值和新值?
我只是有一个问题,得到我选择的确切领域的价值。
我写了这段代码,我希望得到一个确切字段的旧值和新值。
DECLARE @ColName NVARCHAR(225) ,
@FieldID INT;
DECLARE columnCursor CURSOR
FOR
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'acc_Account'
AND TABLE_SCHEMA = 'dbo';
DECLARE @deleted_colmn INT;
DECLARE CurDB CURSOR
FOR
SELECT @deleted_colmn
FROM #Deleted;
OPEN columnCursor;
FETCH NEXT FROM columnCursor INTO @ColName;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
--OPEN CurDB;
--FETCH NEXT FROM CurDB INTO @deleted_colmn;
SET @FieldID = (SELECT TOP 1
FieldID
FROM fld_Field
WHERE fld_Field.FieldName = @ColName
);
SET @newvalue = (SELECT TOP 1
@ColName
FROM Inserted
WHERE @ColName = @ColName
);
SET @oldvalue = (SELECT TOP 1
@ColName
FROM Deleted
IF @newvalue <> @oldvalue
BEGIN
INSERT INTO dbo.utl_Audit_Trail_Field
(AuditTrailID ,
FieldID ,
OldValue ,
NewValue ,
CreatedDate ,
CreatedUserID ,
UpdatedDate ,
UpdatedUserID
)
VALUES (@AuditTrailID , -- AuditTrailID - bigint
@FieldID , -- FieldID - bigint
@oldvalue , -- OldValue - nvarchar(1000)
@newvalue , -- NewValue - nvarchar(1000)
@CreatedDate , -- CreatedDate - datetime
@CreatedUserID , -- CreatedUserID - bigint
@CreatedDate , -- UpdatedDate - datetime
@CreatedUserID -- UpdatedUserID - bigint
);
END;
FETCH NEXT FROM columnCursor INTO @ColName;
END; WHERE @ColName = @ColName
);
[首先阅读有关删除和插入的文档](https://docs.microsoft.com/en-us/sql/relational-databases/triggers/use-the-inserted-and-deleted-tables) 希望这可以帮助! –
@BogdanSahlean他们不会在所有教程中不提及我,我是一个很好的例子。 ;-) –
从来没有(我的意思是永远)在触发器中使用光标。永远。这样做是一种很好的方式,可以让一个完美健康的RDBMS尖叫到膝盖上,乞求怜悯。 –