Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Excluir registros no gatilho Em vez de excluir


Este método deve fazer o truque. Um acionador em vez de fará o que você especificar em vez de excluir automaticamente. Isso significa que é fundamental que você faça a exclusão manualmente ou o registro não será excluído. Ele não será executado recursivamente. Isso só pode ser feito em uma tabela sem a exclusão em cascata habilitada. Basicamente, o truque é você se juntar à tabela original no campo id para obter os dados do campo ao qual você não tem acesso na pseudotabela excluída.
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 você puder alterar o campo para varchar(max) ou nvarchar(max), essa é a melhor solução. Text e ntext estão obsoletos e devem ser removidos completamente do SQL Server na próxima versão.