процедура отката транзакции из таблицы аудита в SQL Server - PullRequest
0 голосов
/ 08 мая 2018

Я создал таблицу аудита, которая заполняется журналом аудита (срабатывает после каждого обновления, удаления и вставки) для разных таблиц в моей базе данных. Теперь меня попросили создать хранимую процедуру (скрипт) для отката изменения данных с использованием идентификатора аудита. Как мне это сделать? Я написал сценарий, который кажется хорошим. Команда принята 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 голосов
/ 08 мая 2018

Это должен быть динамический SQL, потому что вы обновляете столбец, определенный в переменной. Сделайте следующее вместо текущего оператора UPDATE.

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