sql >> Base de Datos >  >> RDS >> Sqlserver

Eliminar registros dentro del activador En lugar de eliminar

Este método debería hacer el truco. Un disparador en lugar de hará lo que especifique en lugar de hacer la eliminación automáticamente. Esto significa que es clave que realice la eliminación manualmente o el registro no se eliminará. No se ejecutará recursivamente. Solo se puede hacer en una tabla sin la eliminación en cascada habilitada. Básicamente, el truco es unirse a la tabla original en el campo de identificación para obtener los datos del campo al que no tiene acceso en la pseudotabla eliminada.

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

Sin embargo, si puede cambiar el campo a varchar (max) o nvarchar (max), esa es la mejor solución. Text y ntext están en desuso y deben eliminarse por completo de SQL Server en la próxima versión.