データベースにテーブル MyTab があるとします。たとえば、このテーブルのトリガーを削除します。次に、ストアド プロシージャで、このテーブルからデータを削除しようとしましたが、この削除のためだけに削除トリガーを停止したいと考えています。その後、トリガーを通常に戻します。次のようなストアド プロシージャにコードを含めることは可能ですか。
stop trigger on MyTab;
delete from MyTab where ...;
put the trigger back;
データベースにテーブル MyTab があるとします。たとえば、このテーブルのトリガーを削除します。次に、ストアド プロシージャで、このテーブルからデータを削除しようとしましたが、この削除のためだけに削除トリガーを停止したいと考えています。その後、トリガーを通常に戻します。次のようなストアド プロシージャにコードを含めることは可能ですか。
stop trigger on MyTab;
delete from MyTab where ...;
put the trigger back;
ここで説明したように、トリガーを無効にして有効にすることができますが、エラーが原因でトリガーが無効になったままになることがないように、おそらくこれをtry-catchやトランザクションに入れます。
例えば:
set xact_abort on; -- Auto-rollback on any error
begin transaction;
alter table MyTab disable trigger TR_MyTab_Delete;
delete from MyTab where 1/0 = 1; -- Causes div by zero error
alter table MyTab enable trigger TR_MyTab_Delete; -- Won't run becuase of above error
commit;
上記のスクリプトはエラーをスローしますが、トリガーを無効のままにすることはありません。xact_abortを設定すると、トリガーの無効化を含め、トランザクションがロールバックされることが保証されます。