Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Elimina i record all'interno del trigger Invece di eliminare

Questo metodo dovrebbe fare il trucco. Un trigger invece di farà tutto ciò che specifichi invece di eseguire automaticamente l'eliminazione. Ciò significa che è fondamentale eliminarlo manualmente o il record non verrà eliminato. Non verrà eseguito in modo ricorsivo. Può essere eseguito solo su una tabella senza l'eliminazione a cascata abilitata. Fondamentalmente il trucco è unirti alla tabella originale nel campo id per ottenere i dati dal campo a cui non hai accesso nella pseudotabella eliminata.

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

Se puoi cambiare il campo in varchar(max) o nvarchar(max) questa è la soluzione migliore. Text e ntext sono obsoleti e dovrebbero essere rimossi del tutto da SQL Server nella versione successiva.