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

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » ストアド・プロシージャとトリガ » プロシージャ、トリガ、バッチの使用 » トリガの概要

 

トリガの作成

Sybase Central または Interactive SQL を使ってトリガを作成します。Sybase Central では、ウィザードを使用して必要な情報を指定できます。Interactive SQL では、CREATE TRIGGER 文を使用できます。いずれのツールを使用する場合でも、トリガを作成するには DBA または RESOURCE 権限が必要です。また、トリガと関連するテーブルに対して ALTER パーミッションが必要です。

トリガの本文は複合文、つまり BEGIN と END に挟まれ、セミコロンで区切られた SQL 文のセットから構成されています。

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

♦  指定されたテーブルに対するトリガを作成するには、次の手順に従います (Sybase Central の場合)。
  1. DBA 権限または RESOURCE 権限のあるユーザとしてデータベースに接続します。

  2. 左ウィンドウ枠で、[トリガ] をクリックします。

  3. [ファイル] - [新規] - [トリガ] を選択します。

  4. トリガ作成ウィザードの指示に従います。

  5. コードを完了するには、右ウィンドウ枠で、[SQL] タブをクリックします。

♦  指定されたテーブルに対するトリガを作成するには、次の手順に従います (SQL の場合)。
  1. DBA 権限のあるユーザとしてデータベースに接続します。トリガに関連付けられているテーブルに対して ALTER パーミッションも必要です。

  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 句は、文レベルとロー・レベルのトリガで少し異なる意味を持ちます。文レベルではテーブルが対象になりますが、ロー・レベルでは変更されるローが対象になります。

参照