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

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

 

テーブル内でのトリガの作成 (SQL の場合)

CREATE TRIGGER 文を使用して、テーブル内にトリガを作成します。トリガの本文は複合文、つまり BEGIN 文と END 文に挟まれ、セミコロンで区切られた SQL 文のセットから構成されています。

前提条件

CREATE ANY TRIGGER または CREATE ANY OBJECT のシステム権限が必要です。さらに、そのトリガが作成されるテーブルの所有者であるか、または次のいずれかの権限を持っていることも必要です。

  • そのテーブルに対する ALTER 権限
  • ALTER ANY TABLE システム権限
  • ALTER ANY OBJECT システム権限

内容と備考

COMMIT と ROLLBACK 文、いくつかの ROLLBACK TO SAVEPOINT 文をトリガ内に使用することはできません。

 ♦ タスク
  1. データベースに接続します。

  2. CREATE TRIGGER 文を実行します。

結果

新しいトリガが作成されます。

  • 例 1:ローレベルの INSERT トリガ   次にローレベルの INSERT トリガの例を示します。新しい従業員の生年月日が正しく入力されたかどうかをチェックします。


    CREATE TRIGGER check_birth_date
       AFTER INSERT ON Employees
    REFERENCING NEW AS new_employee
    FOR EACH ROW
    BEGIN
         DECLARE err_user_error EXCEPTION
       FOR SQLSTATE '99999';
       IF new_employee.BirthDate > 'June 6, 2001' THEN
              SIGNAL err_user_error;
       END IF;
    END;

    注意

    SQL Anywhere のサンプルデータベースに check_birth_date というトリガがすでにある可能性があります。このトリガがある場合に上記の SQL 文を実行しようとすると、トリガの定義が既存のトリガと矛盾していることを示すエラーが表示されます。

    このトリガは、Employees テーブルに新しいローが追加されると起動されます。2001 年 6 月 6 日以降の生年月日に対応する新しいローを検知し、エラーにします。

    フレーズ REFERENCING NEW AS new_employee は、トリガコード中の文がエイリアス new_employee を使用して、新しいローのデータを参照できるようにします。

    エラーが発生すると、トリガ元の文、およびトリガによる前の変更内容がすべて取り消されます。

    Employees テーブルに複数のローを追加する INSERT 文の場合は、新しいローごとに check_birth_date トリガが起動されます。どれか 1 つのローでトリガが失敗すると、INSERT 文のすべての結果がロールバックされます。

    ローを追加した後でなく、追加する前にトリガが起動されるようにするには、例文の 2 行目を次のように変更します。

    BEFORE INSERT ON Employees

    REFERENCING NEW 句は追加されるローの値を参照します。この句はトリガが起動されるタイミング (BEFORE と AFTER) には影響されません。

    トリガではなく、宣言参照整合性や検査制約を使用して整合性を確保する方が簡単な場合があります。たとえば、上記の例でカラム検査制約を使用すると、さらに効率が良く、簡潔になります。

    CHECK (@col <= 'June 6, 2001')

  • 例 2:ローレベルの DELETE トリガの例   次に示す CREATE TRIGGER 文は、ローレベルの DELETE トリガを定義します。
    CREATE TRIGGER mytrigger 
    BEFORE DELETE ON Employees
    REFERENCING OLD AS oldtable
    FOR EACH ROW
    BEGIN
       ...
    END;

    REFERENCING OLD 句は、トリガが起動されるタイミング (BEFORE または AFTER) に影響されず、エイリアス oldtable を使用して、削除されるローの値を削除トリガコードが参照できるようにします。

  • 例 3:文レベルの UPDATE トリガの例   文レベルの UPDATE トリガを作成する CREATE TRIGGER 文の例を次に示します。
    CREATE TRIGGER mytrigger AFTER UPDATE ON Employees
    REFERENCING NEW AS table_after_update
                OLD AS table_before_update
    FOR EACH STATEMENT
    BEGIN
       ...
    END;

    REFERENCING NEW 句と REFERENCING OLD 句は、UPDATE トリガのコマンド文が更新の前と後の両方の値を参照できるようにします。テーブルエイリアス table_after_update は、新しいローのカラムを参照し、テーブルエイリアス table_before_update は古いローのカラムを参照します。

    REFERENCING NEW 句と REFERENCING OLD 句は、文レベルとローレベルのトリガで少し異なる意味を持ちます。文レベルではテーブルが対象になりますが、ローレベルでは変更されるローが対象になります。


 参照