Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » ストアドプロシージャー、トリガー、バッチ、ユーザー定義関数 » トリガー

 

トリガー操作の一時的な無効化

ユーザーがカラムデータに対して (トリガーを起動する) アクションを実行するときに、トリガーの操作が一時的に無効になるようにトリガーを設定できます。その場合でも、事前定義の接続変数を含むプロシージャーを使用して、トリガーを起動してその操作を実行できます。ユーザーは、トリガーが起動されてもトリガー操作を実行しないで、カラムに対して INSERT、ALTER、または DELETE を実行できます。

 ♦ 1 つのトリガーの操作の一時的な無効化
注意

ローレベルのトリガーを使用している場合は、WHEN 句を使用して、トリガーをいつ起動するかを指定します。

この例では、接続変数が存在するかどうかに基づいてトリガーの操作を無効にします。

  1. 接続変数の状態を確認してトリガー論理が有効かどうかを判断する AFTER INSERT トリガーを作成します。変数が存在しない場合、トリガーの操作は有効です。



    CREATE TRIGGER myTrig AFTER INSERT
    REFERENCING NEW AS new-name
    FOR EACH STATEMENT
    BEGIN
       DECLARE @execute_trigger integer;
       IF varexists('enable_trigger_logic') = 1 THEN
         SET @execute_trigger = enable_trigger_logic;
       ELSE
         SET @execute_trigger = 1;
       END IF;
       IF @execute_trigger = 1 THEN
          ... -your-trigger-logic
       END IF;
    END;
  2. 次のコードを文に追加し、手順 1 で作成したトリガーを呼び出します。文では、接続変数を使用してトリガーをいつ無効にするかを制御します。文は無効にするコードを囲んでいる必要があります。

    ...
      IF varexists('enable_trigger_logic') = 0 THEN
           CREATE VARIABLE enable_trigger_logic INT;
      END IF;
      SET enable_trigger_logic = 0;
       ... execute-your-code-that-you-do-not-want-triggers-to-run
       SET enable_trigger_logic = 1;
       ... now-your-trigger-logic-will-do-its-work  
 ♦ 複数のトリガーの操作の一時的な無効化

この例では、例 1 の接続変数の方法を使用して、複数のトリガーの操作を制御します。複数のトリガーを有効および無効にするために呼び出すことができる 2 つのプロシージャーを作成します。トリガー操作が有効かどうかを確認するために使用することができる関数も作成します。

  1. トリガー操作を無効にするために呼び出すことができるプロシージャーを作成します。動作は接続変数の値に基づいています。

    CREATE PROCEDURE sp_disable_triggers()
    BEGIN
           IF VAREXISTS ('enable_trigger_logic') = 0 THEN
              CREATE VARIABLE enable_trigger_logic INT;
           END IF;
           SET enable_trigger_logic = 0;
    END;
  2. トリガー操作を有効にするために呼び出すことができるプロシージャーを作成します。動作は接続変数の値に基づいています。

    CREATE PROCEDURE sp_enable_triggers()
    BEGIN
            IF VAREXISTS ('enable_trigger_logic') = 0 THEN
              CREATE VARIABLE enable_trigger_logic INT;
            END IF;
          SET enable_trigger_logic = 1;
    END;
  3. トリガー操作が有効かどうかを判別するために呼び出すことができる関数を作成します。

    CREATE FUNCTION f_are_triggers_enabled()
    RETURNS INT
    BEGIN
           IF VAREXISTS ('enable_trigger_logic') = 1 THEN
             RETURN enable_trigger_logic;
           ELSE
              RETURN 1;
           END IF;
    END;
  4. 操作をいつ実行するかを制御するトリガーに IF 句を追加します。

    IF f_are_triggers_enabled() = 1 THEN
         ... your-trigger-logic
    END IF;
  5. トリガー操作を有効にするために手順 2 で作成したプロシージャーを呼び出します。

    CALL sp_enable_triggers();
    ... execute-code-where-trigger-logic-runs

    トリガー操作を無効にするために手順 1 で作成したプロシージャーを呼び出します。

    CALL sp_disable_triggers();
    ... execute-your-code-where-trigger-logic-is-disabled
 参照