【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

[スポンサーリンク]

関連記事
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
サイト内検索
プロフィール

プロフィール

[Name : じゃぶじゃぶ(@jbjb_2019)]
都内で社内SEをしているおじさん。
仕事で得られる知識だけでは限界を感じ、 WEBの勉強がてらITブログを開始。
サーバからWEBサイトまでフルスクラッチで開発しました。
現在は勉強のモチベーションを保つために活用中。
興味があることを雑記的に書いていきます。

[スポンサーリンク]

[スポンサードリンク]