从 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)
我创建了一个审计 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)