この方法でうまくいくはずです。トリガーの代わりに、自動的に削除を行う代わりに、指定したものをすべて実行します。これは、手動で削除を行うことが重要であることを意味します。そうしないと、レコードは削除されません。再帰的に実行されることはありません。カスケード削除が有効になっていないテーブルでのみ実行できます。基本的に、トリックは、削除された疑似テーブルでアクセスできないフィールドからデータを取得するために、idフィールドの元のテーブルに参加することです。
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
フィールドをvarchar(max)またはnvarchar(max)に変更できる場合は、これが最善の解決策です。 Textとntextは非推奨であり、次のバージョンでSQLServerから完全に削除する必要があります。