Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Supprimer des enregistrements dans le déclencheur Au lieu de supprimer

Cette méthode devrait faire l'affaire. Un déclencheur au lieu de fera tout ce que vous spécifiez au lieu de faire la suppression automatiquement. Cela signifie qu'il est essentiel que vous le supprimiez manuellement, sinon l'enregistrement ne sera pas supprimé. Il ne fonctionnera pas de manière récursive. Cela ne peut être fait que sur une table sans suppression en cascade activée. Fondamentalement, l'astuce consiste à vous joindre à la table d'origine sur le champ id afin d'obtenir les données du champ auquel vous n'avez pas accès dans la pseudotable supprimée.

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

Si vous pouvez modifier le champ en varchar(max) ou nvarchar(max), c'est la meilleure solution. Text et ntext sont obsolètes et devraient être complètement supprimés de SQL Server dans la prochaine version.