Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Löschen von Datensätzen innerhalb des Auslösers „Statt Löschen“.

Diese Methode sollte den Zweck erfüllen. Ein Statt-Trigger wird alles tun, was Sie angeben, anstatt das Löschen automatisch durchzuführen. Dies bedeutet, dass es wichtig ist, dass Sie das Löschen manuell durchführen, da sonst der Datensatz nicht gelöscht wird. Es wird nicht rekursiv ausgeführt. Dies kann nur für eine Tabelle ohne aktiviertes Cascade Delete durchgeführt werden. Im Grunde besteht der Trick darin, dass Sie der ursprünglichen Tabelle im ID-Feld beitreten, um die Daten aus dem Feld zu erhalten, auf das Sie in der gelöschten Pseudotabelle keinen Zugriff haben.

create table dbo.mytesting (test_id int, sometext text)
go
create table dbo.myaudit (test_id int, sometext text)
go
insert into dbo.mytesting
values (1, 'test')
go

Create Trigger audit_Table_Deletes on dbo.mytesting INSTEAD OF delete  
as 
if @@rowcount = 0 return; 
Insert into dbo.myaudit (test_id, sometext) 
Select d.test_id, t.sometext from deleted d 
join dbo.mytesting t on t.test_id = d.test_id

Delete dbo.mytesting where test_id in (select test_id from deleted)
go

delete dbo.mytesting where test_id = 1
select * from dbo.mytesting
select * from dbo.myaudit 
Go 

drop table dbo.mytesting
drop table dbo.myaudit

Wenn Sie das Feld in varchar(max) oder nvarchar(max) ändern können, ist dies jedoch die beste Lösung. Text und ntext sind veraltet und sollten in der nächsten Version vollständig aus SQL Server entfernt werden.