6

削除トリガーの代わりに、削除されているテーブル行からテキスト フィールド値を取得して、実際の削除が発生したときにそれらのフィールドを保持できるようにしたいと考えています。何らかの理由で、標準の削除トリガーで削除済みテーブルからそれらを取得できません (SQL エラー)。

トリガーを再起動せずに、「削除の代わりに」トリガー内で実際の削除を行う方法はありますか?

または、行が削除されて新しいレコードに保存されたら、テキスト フィールドを取得するより良い方法はありますか?

4

4 に答える 4

13

この方法でうまくいくはずです。トリガーの代わりに、自動的に削除を行う代わりに、指定したものをすべて実行します。これは、手動で削除を行うことが重要であることを意味します。そうしないと、レコードは削除されません。再帰的に実行されることはありません。カスケード削除が有効になっていないテーブルでのみ実行できます。基本的に、トリックは、削除された疑似テーブルでアクセスできないフィールドからデータを取得するために、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から完全に削除する必要があります。

于 2010-07-16T18:14:53.637 に答える
3

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
于 2010-07-16T15:58:54.977 に答える
-2

私はかつて、削除されていたレコードをキャッチする必要がありました。最初のテーブルと同じ構造の別のテーブルにレコードをコピーするトリガーを作成しました。これは次のようになります。

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.
于 2010-07-16T15:37:45.230 に答える