削除トリガーの代わりに、削除されているテーブル行からテキスト フィールド値を取得して、実際の削除が発生したときにそれらのフィールドを保持できるようにしたいと考えています。何らかの理由で、標準の削除トリガーで削除済みテーブルからそれらを取得できません (SQL エラー)。
トリガーを再起動せずに、「削除の代わりに」トリガー内で実際の削除を行う方法はありますか?
または、行が削除されて新しいレコードに保存されたら、テキスト フィールドを取得するより良い方法はありますか?
削除トリガーの代わりに、削除されているテーブル行からテキスト フィールド値を取得して、実際の削除が発生したときにそれらのフィールドを保持できるようにしたいと考えています。何らかの理由で、標準の削除トリガーで削除済みテーブルからそれらを取得できません (SQL エラー)。
トリガーを再起動せずに、「削除の代わりに」トリガー内で実際の削除を行う方法はありますか?
または、行が削除されて新しいレコードに保存されたら、テキスト フィールドを取得するより良い方法はありますか?
この方法でうまくいくはずです。トリガーの代わりに、自動的に削除を行う代わりに、指定したものをすべて実行します。これは、手動で削除を行うことが重要であることを意味します。そうしないと、レコードは削除されません。再帰的に実行されることはありません。カスケード削除が有効になっていないテーブルでのみ実行できます。基本的に、トリックは、削除された疑似テーブルでアクセスできないフィールドからデータを取得するために、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)に変更できる場合は、これが最善の解決策です。テキストとntextは非推奨であり、次のバージョンではSQLServerから完全に削除する必要があります。
After Trigger でこれを行う方がおそらく良いでしょう。それほど複雑ではありません。
次のテーブルがある場合
CREATE TABLE [dbo].[Data](
[DocumentID] [smallint] NULL,
[Data] [nvarchar](max) NULL
)
と
CREATE TABLE [dbo].[Audit](
[DocumentID] [smallint] NULL,
[Data] [nvarchar](max) NULL
)
次の After トリガーは、データ テーブルから行が削除されるたびに、監査テーブルに行を挿入する必要があります。
Create Trigger audit_Table_Deletes on dbo.Data for delete
as
if @@rowcount = 0 return;
Insert into audit (DocumentID, Data) Select DocumentID, Data from deleted;
Go
私はかつて、削除されていたレコードをキャッチする必要がありました。最初のテーブルと同じ構造の別のテーブルにレコードをコピーするトリガーを作成しました。これは次のようになります。
create trigger [delta_del] on [customer]
for delete
as
declare <variables> from deleted;
open mycurs
fetch next from mycurs into @v1, @v2
while (@@fetch_status = 0
begin
insert into delta (fields) values (@v1, @v2)
fetch next from mycursor into @v1, @v2
end
close mycursor
deallocate mycursor
etc.