I'm running into an issue where I need to Save a copy of a record into a "History" table with the original field values of the updated record before I do the update.
I'm using a trigger to do this. The trigger INSERTED value should contain the row field values after the update and DELETED should show the field values before the update.
However, whenever the example trigger code runs, the return of the SELECT always returns null for the ArticleID, Title, StepContent, and SortOrder parameters. However if I were to change the line of code where it pulls from DELETED to pull from INSERTED it works just fine.
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
Works when I change this:
SELECT @SortOrder = SortOrder, @Title = Title, @StepContent = StepContent, @ArticleID = ArticleID FROM DELETED;
To this:
SELECT @SortOrder = SortOrder, @Title = Title, @StepContent = StepContent, @ArticleID = ArticleID FROM INSERTED;
Here is the update query I am running:
UPDATE [dbo].[ArticleStep] SET [ArticleID] = 2 ,[SortOrder] = 3,[StepContent] = 'Changed Text' WHERE ID = 1