Tato metoda by měla stačit. Místo spouštěče provede vše, co určíte, namísto automatického mazání. To znamená, že je klíčové, abyste v něm provedli smazání ručně, jinak se záznam nesmaže. Nepoběží rekurzivně. Lze to provést pouze na stole bez povoleného mazání kaskády. V podstatě je trik v tom, že se připojíte k původní tabulce v poli id, abyste získali data z pole, ke kterému nemáte přístup ve smazané pseudotabulce.
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
Pokud můžete změnit pole na varchar(max) nebo nvarchar(max), je to nejlepší řešení. Text a ntext jsou zastaralé a v příští verzi by měly být ze serveru SQL zcela odstraněny.