Sybase Central または Interactive SQL を使ってトリガを作成します。Sybase Central では、ウィザードを使用して必要な情報を指定できます。Interactive SQL では、CREATE TRIGGER 文を使用できます。いずれのツールを使用する場合でも、トリガを作成するには DBA または RESOURCE 権限が必要です。また、トリガと関連するテーブルに対して ALTER パーミッションが必要です。
トリガの本文は複合文、つまり BEGIN と END に挟まれ、セミコロンで区切られた SQL 文のセットから構成されています。
COMMIT と ROLLBACK 文、いくつかの ROLLBACK TO SAVEPOINT 文をトリガ内に使用することはできません。
DBA 権限または RESOURCE 権限のあるユーザとしてデータベースに接続します。
左ウィンドウ枠で、[トリガ] をクリックします。
[ファイル] - [新規] - [トリガ] を選択します。
トリガ作成ウィザードの指示に従います。
コードを完了するには、右ウィンドウ枠で、[SQL] タブをクリックします。
DBA 権限のあるユーザとしてデータベースに接続します。トリガに関連付けられているテーブルに対して ALTER パーミッションも必要です。
CREATE TRIGGER 文を実行します。
次にロー・レベルの 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') |
次に示す CREATE TRIGGER 文は、ロー・レベルの DELETE トリガを定義します。
CREATE TRIGGER mytrigger BEFORE DELETE ON Employees REFERENCING OLD AS oldtable FOR EACH ROW BEGIN ... END; |
REFERENCING OLD 句は、トリガが起動されるタイミング (BEFORE または AFTER) に影響されず、エイリアス oldtable を使用して、削除されるローの値を削除トリガ・コードが参照できるようにします。
文レベルの 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 句は、文レベルとロー・レベルのトリガで少し異なる意味を持ちます。文レベルではテーブルが対象になりますが、ロー・レベルでは変更されるローが対象になります。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |