从 SQL 服务器中的审核 table 回滚事务的过程

procedure to rollback a transaction from audit table in SQL Server

我创建了一个审计 table,它由我数据库中不同 table 上的审计跟踪(在每次更新、删除和插入后触发)填充。我现在被要求创建一个存储过程(脚本)来使用审计 ID 回滚数据更改。我该怎么做。我写了一个看起来不错的脚本。命令被 SQL 服务器接受(命令成功完成)。不幸的是,当我通过传递 Audit_id 对其进行测试时,命令已完成但数据未回滚。这是我开发的程序。任何帮助将不胜感激。

create  PROCEDURE [dbo].[spAudit_Rollback_2]
@AUDIT_ID NVARCHAR(MAX)

AS 
SET Nocount on

BEGIN
DECLARE  
@TABLE_NAME VARCHAR(100),
@COLUMN  VARCHAR(100),
@OLD_VALUE VARCHAR(200),
@ID        varchar(50)

SELECT @TABLE_NAME = TABLE_NAME FROM AUDIT;
SELECT @COLUMN = [COLUMN] FROM AUDIT;
SELECT @AUDIT_ID = AUDIT_ID FROM AUDIT;
SELECT @OLD_VALUE = OLD_VALUE FROM AUDIT
SELECT @ID  = ROW_DESCRIPTION FROM AUDIT;  

update [Production].[UnitMeasure]   
set @COLUMN = @OLD_VALUE  
WHERE  [Production].[UnitMeasure].[UnitMeasureCode] = @ID
END


[dbo].[spAudit_Rollback_2]'130F0598-EB89-44E5-A64A-ABDFF56809B5

这是相同的脚本,但使用了 adventureworks2017 数据库和数据。

如果可能的话,我什至更愿意使用变量从 Audit 中检索 table 名称并在过程中使用它。这也给了我另一个错误。 对这个过程的任何帮助都会很棒。

这需要是动态的 SQL 因为您要更新在变量中定义的列。执行以下操作代替您当前的 UPDATE 语句。

DECLARE @sql VARCHAR(1000) = ''
SET @sql = 'UPDATE [Production].[UnitMeasure] ' +
    'SET ' + @COLUMN + ' = ''' + @OLD_VALUE  + '''' +
    'WHERE  [Production].[UnitMeasure].[UnitMeasureCode] = ''' + @ID + ''''
EXEC(@sql)