CREATE TRIGGER 文を使用して、テーブル内にトリガを作成します。トリガの本文は複合文、つまり BEGIN 文と END 文に挟まれ、セミコロンで区切られた SQL 文のセットから構成されています。
前提条件
CREATE ANY TRIGGER または CREATE ANY OBJECT のシステム権限が必要です。さらに、そのトリガが作成されるテーブルの所有者であるか、または次のいずれかの権限を持っていることも必要です。
内容と備考
COMMIT と ROLLBACK 文、いくつかの ROLLBACK TO SAVEPOINT 文をトリガ内に使用することはできません。
データベースに接続します。
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 句は、文レベルとローレベルのトリガで少し異なる意味を持ちます。文レベルではテーブルが対象になりますが、ローレベルでは変更されるローが対象になります。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |