Ta metoda powinna załatwić sprawę. Zamiast wyzwalacza zrobi wszystko, co określisz, zamiast usuwać automatycznie. Oznacza to, że kluczowe jest, aby usunąć w nim ręcznie, w przeciwnym razie rekord nie zostanie usunięty. Nie będzie działać rekurencyjnie. Można to zrobić tylko w tabeli bez włączonej funkcji usuwania kaskadowego. Zasadniczo sztuczka polega na tym, że dołączasz do oryginalnej tabeli w polu identyfikatora, aby uzyskać dane z pola, do którego nie masz dostępu w usuniętej pseudotabeli.
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
Jeśli możesz zmienić pole na varchar(max) lub nvarchar(max), jest to jednak najlepsze rozwiązanie. Text i ntext są przestarzałe i powinny zostać całkowicie usunięte z SQL Server w następnej wersji.