Я столкнулся с проблемой, когда мне нужно сохранить копию записи в таблице «History» с исходными значениями поля обновленной записи перед тем, как я выполню обновление.
Я использую триггер для этого.Значение INSERTED триггера должно содержать значения полей строки после обновления, а DELETED должен отображать значения полей до обновления.
Однако всякий раз, когда запускается примерный код триггера, возврат SELECT всегда возвращает нуль для ArticleIDПараметры Title, StepContent и SortOrder.Однако, если бы я изменил строку кода, где он вытягивает из DELETED, чтобы вытянуть из INSERTED, это работает просто отлично.
ALTER TRIGGER [dbo].[TRG_SaveHistory]
ON [dbo].[ArticleStep]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SortOrder INT,
@ArticleID INT,
@ArticleHistoryID INT,
@Title varchar(max),
@StepContent varchar(max);
--SELECT @SortOrder = SortOrder, @Title = Title, @StepContent = StepContent, @ArticleID = ArticleID FROM INSERTED;
SELECT TOP (1) @SortOrder = SortOrder, @Title = Title, @StepContent = StepContent, @ArticleID = ArticleID FROM DELETED WHERE @SortOrder != null;
SELECT TOP (1) @ArticleHistoryID = ID FROM dbo.ArticleHistory WHERE OriginalArticleID = @ArticleID ORDER BY ID DESC;
IF @SortOrder IS NOT Null AND @ArticleHistoryID IS NOT NULL
INSERT INTO [dbo].[ArticleStepHistory]
([ArticleHistoryID]
,[SortOrder]
,[Title]
,[StepContent])
VALUES
(@ArticleHistoryID
,@SortOrder
,@Title
,@StepContent);
END
Работает, когда я изменяю это:
SELECT @SortOrder = SortOrder, @Title = Title, @StepContent = StepContent, @ArticleID = ArticleID FROM DELETED;
На это:
SELECT @SortOrder = SortOrder, @Title = Title, @StepContent = StepContent, @ArticleID = ArticleID FROM INSERTED;
Вот запрос на обновление, который я выполняю:
UPDATE [dbo].[ArticleStep] SET [ArticleID] = 2 ,[SortOrder] = 3,[StepContent] = 'Changed Text' WHERE ID = 1