【SQLServer】トリガーを一時的に無効化(停止) / 有効化(再開)する方法
-
カテゴリ:
- DB
-
タグ:
- #SQLServer
トリガーを設定しているテーブルに対して検証作業をしていると、トリガーが発動して余計なテーブル余計なデータが作成されるのが煩わしい時があります。
そんなときはトリガーを一時的に無効化しておいて、作業が終わったら有効化すると検証作業が楽です。
トリガーを無効化、有効化
トリガーを無効化、または有効化するには以下のSQLを実行すると可能です。
-- トリガーを無効化(停止)する
ALTER TABLE <テーブル名> DISABLE TRIGGER <トリガー名>;
-- または以下のSQLでも可
DISABLE TRIGGER <トリガー名> ON <テーブル名>;
-- トリガーを有効化(再開)する
ALTER TABLE <テーブル名> ENABLE TRIGGER <トリガー名>;
-- または以下のSQLでも可
ENABLE TRIGGER <トリガー名> ON <テーブル名>;
SQL一発で行けるかとっても簡単です。
トリガーを無効化してみる
試しにトリガーを無効化してみたいと思います。
無効化する前に、現在のトリガーの状態を確認します。
-- トリガーの状態を確認
SELECT
O.name AS 'テーブル名'
, O.type_desc AS 'オブジェクトタイプ'
, TR.name AS 'トリガー名'
, TR.is_disabled AS '無効化'
FROM
sys.triggers AS TR
INNER JOIN
sys.objects AS O
ON TR.parent_id = O.object_id
;
+--------------+------------------+----------------------------+-------+
|テーブル名 |オブジェクトタイプ |トリガー名 |無効化 |
+--------------+------------------+----------------------------+-------+
|M_USER |USER_TABLE |TRIGGER_M_USER_UPDATED |FALSE |
+--------------+------------------+----------------------------+-------+
|M_USER |USER_TABLE |TRIGGER_M_USER_DELETED |FALSE |
+--------------+------------------+----------------------------+-------+
|T_CONTRACT |USER_TABLE |TRIGGER_T_CONTRACT_INSERTED |FALSE |
+--------------+------------------+----------------------------+-------+
|T_CONTRACT |USER_TABLE |TRIGGER_T_CONTRACT_UPDATED |FALSE |
+--------------+------------------+----------------------------+-------+
|T_CONTRACT |USER_TABLE |TRIGGER_T_CONTRACT_DELETED |FALSE |
+--------------+------------------+----------------------------+-------+
ユーザマスタ(M_USER)と契約テーブル(T_CONTRACT)の2テーブルがあり、ユーザマスタには2つのトリガーが、契約テーブルには3つのトリガーが存在することが分かります。
[無効化]のカラムが全てFALSEになっているので、現状すべてのトリガーが有効になっていることを意味します。
それではトリガー「TRIGGER_T_CONTRACT_INSERTED」だけ無効化してみます。
ALTER TABLE T_CONTRACT DISABLE TRIGGER TRIGGER_T_CONTRACT_UPDATED;
+--------------+------------------+----------------------------+-------+
|テーブル名 |オブジェクトタイプ |トリガー名 |無効化 |
+--------------+------------------+----------------------------+-------+
|M_USER |USER_TABLE |TRIGGER_M_USER_UPDATED |FALSE |
+--------------+------------------+----------------------------+-------+
|M_USER |USER_TABLE |TRIGGER_M_USER_DELETED |FALSE |
+--------------+------------------+----------------------------+-------+
|T_CONTRACT |USER_TABLE |TRIGGER_T_CONTRACT_INSERTED |TRUE |
+--------------+------------------+----------------------------+-------+
|T_CONTRACT |USER_TABLE |TRIGGER_T_CONTRACT_UPDATED |FALSE |
+--------------+------------------+----------------------------+-------+
|T_CONTRACT |USER_TABLE |TRIGGER_T_CONTRACT_DELETED |FALSE |
+--------------+------------------+----------------------------+--------+
TRIGGER_T_CONTRACT_INSERTEDの[無効化]がTRUEに変更され、無効化されたことが分かると思います。
【補足】テーブルのトリガーをすべて無効化
補足として、テーブルに設定しているすべてのトリガーを有効、無効にするには以下のSQLを実行してください。
-- 契約テーブル(T_CONTRACT)の全てのトリガーを無効化する
ALTER TABLE T_CONTRACT DISABLE TRIGGER ALL;
-- 契約テーブル(T_CONTRACT)の全てのトリガーを有効化する
ALTER TABLE T_CONTRACT ENABLE TRIGGER ALL;
以上です。
投稿日:2020-07-02
更新日:2020-07-10