2017-08-10 42 views
0

我創建了下表如何在審計表中保存以前的版本?

CREATE TABLE [dbo].[Audit.Awards] 
(SessionID int IDENTITY(1,1) NOT NULL, 
ID INT NOT NULL, 
Name NVARCHAR(max) NOT NULL, 
Abstract NVARCHAR(max) NOT NULL,  
ChangedDate DATETIME NOT NULL Default GETDATE(), 
ChangedBy NVARCHAR(40)) 

,我創建了以下觸發

create trigger tIU on [dbo].[Awards] after UPDATE,insert 
as 
declare @ID int; 
declare @name varchar(max); 
declare @abstract varchar(max); 

begin 
select @ID=i.ID,@name=i.name,@abstract=i.abstract from inserted i; 
insert into [dbo].[Audit.Awards](ID,name, abstract) values(@ID,@name,@abstract) 
end 

觸發目前從audit.awards表更新保存新的數據。如何保存被覆蓋的數據?

+0

你問你如何只保存已更改的數據? – Leonidas199x

+0

你也創建了一個'BEFORE UPDATE'觸發器 –

+2

你的觸發器是致命的缺陷。插入和刪除可以包含多條記錄。你永遠不要爲插入或刪除的參數賦值,因爲它們不是標量。改爲在插入中使用select語句。 – HLGEM

回答

3

在你的觸發器中,從deleted中選擇而不是inserted

順便說一句,你應該使用INSERT..SELECT來代替局部變量。

insert into [dbo].[Audit.Awards](ID,name, abstract) 
select ID,name,abstract from deleted 
+0

如果你想填充changedBy字段,那麼你需要抓住用戶,它可以是列上的一個約束:https://docs.microsoft.com/en-us/sql/t-sql/functions/current -user-的Transact-SQL – HLGEM

相關問題