2017-08-10 1 views
0

Ich habe die folgende TabelleWie speichert man die vorherige Version in der Audit-Tabelle?

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)) 

und Ich habe den folgenden Trigger

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 

Der Auslöser zur Zeit speichert die neuen Daten aus dem Update in der audit.awards Tabelle. Wie speichere ich die Daten, die überschrieben wurden?

+0

Fragen Sie, wie Sie nur die Daten speichern, die geändert wurden? – Leonidas199x

+0

Sie erstellen auch einen 'BEFORE UPDATE'-Trigger –

+2

Ihr Trigger ist tödlich fehlerhaft. Eingefügt und gelöscht kann mehr als einen Datensatz enthalten. Sie weisen einem Parameter NIEMALS einen Wert von eingefügt oder gelöscht zu, da sie nicht skalar sind. Verwenden Sie stattdessen eine select-Anweisung in Ihrer Einfügung. – HLGEM

Antwort

3

Wählen Sie in Ihrem Auslöser deleted statt inserted.

Und übrigens sollten Sie dies mit einem INSERT..SELECT anstelle von lokalen Variablen tun.

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

Und wenn Sie das Feld "changedBy" füllen möchten, müssen Sie den Benutzer greifen. Dies kann eine Einschränkung für die Spalte sein: https://docs.microsoft.com/en-us/sql/t-sql/functions/current -user-transact-sql – HLGEM

Verwandte Themen