从SQL Server

时间:2018-05-07 23:11:37

标签: sql-server stored-procedures rollback audit

我创建了一个审计表,该数据库由我的数据库中不同表上的审计跟踪(每次更新,删除和插入后触发)填充。我现在被要求创建一个存储过程(脚本)来使用审计ID回滚数据更改。我该怎么做呢我写了一个好看的剧本。 SQL Server接受该命令(命令已成功完成)。不幸的是,当我通过传递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中检索该表名,并在过程中使用它。这也给了我另一个错误。 任何有关此程序的帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

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

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