この文は、データベースへの新しいトリガの作成に使用します。特に SQL Remote が使用するために設計されたトリガのフォームが 1 つ用意されています。
CREATE TRIGGER trigger-name trigger-time
trigger-event, ...
[ ORDER integer ] ON table-name
[ REFERENCING [ OLD AS old-name ]
[ NEW AS new-name ] ]
[ REMOTE AS remote-name ] ]
[ FOR EACH { ROW | STATEMENT } ]
[ WHEN ( search-condition ) ]
[ IF UPDATE ( column-name ) THEN
[ { AND | OR } UPDATE ( column-name ) ] ... ]
compound-statement
[ ELSEIF UPDATE ( column-name ) THEN
[ { AND | OR } UPDATE ( column-name ) ] ...
compound-statement
END IF ] ]
trigger-time:
BEFORE | AFTER | RESOLVE
trigger-event:
DELETE | INSERT | UPDATE
| UPDATE OF column-name [, column-name, ...]
trigger-time ロー・レベルのトリガを定義して、挿入、更新、または削除の前 (BEFORE) または後 (AFTER) に実行できます。文レベルのトリガは、文の後 (AFTER) に実行されます。RESOLVE トリガ時間は、SQL Remote と一緒に使用します。これは、ロー・レベルの UPDATE または UPDATE OF カラム・リストの前でだけ起動されます。
BEFORE UPDATE トリガは、ローを対象に UPDATE が実行されるたびに起動されます。この場合、新しい値が古い値と異なるかどうかは問題ではありません。一方、AFTER UPDATE トリガは、新しい値が古い値と異なる場合にのみ起動されます。
トリガ・イベント トリガは次のイベントの 1 つまたは複数によって起動できます。
DELETE 関連するテーブルのローが削除されると、呼び出されます。
INSERT このトリガに関連するテーブルの中に新しいローが挿入されると、呼び出されます。
UPDATE 関連するテーブルのローが更新されると、呼び出されます。
UPDATE OF column-list 関連するテーブルのローが更新され、column-list のカラムが修正されると、呼び出されます。
特に制限なし
RESOURCE 権限またはテーブルに対する ALTER パーミッションが必要です。または、DBA 権限が必要です。CREATE TRIGGER はテーブルにテーブル・ロックを設定するので、テーブルを排他的に使用してください。
オートコミット
CREATE TRIGGER 文は、データベースのテーブルに関連するトリガを作成し、そのデータベースにトリガを格納します。
BEFORE UPDATE トリガは、ローに対して更新が実行されるたびに起動されます。この場合、新しい値が古い値と異なるかどうかは問題ではありません。一方、AFTER UPDATE トリガは、新しい値が古い値と異なる場合にのみ起動されます。
トリガをロー・レベルのトリガとして宣言すると、各ローを修正する前または後にトリガが実行されます。また、トリガを文レベルのトリガとして宣言すると、トリガ文全体が完了してから、トリガが実行されます。
ロー・レベルのトリガを定義して、挿入、更新、または削除の前 (BEFORE) または後 (AFTER) に実行できます。文レベルのトリガは、文の後 (AFTER) に実行されます。解析 (RESOLVE) トリガ時間は、SQL Remote と一緒に使用します。これは、ロー・レベルの UPDATE または UPDATE OF columun-list イベントの前にだけ起動されます。
トリガをロー・レベルのトリガとして宣言するには、FOR EACH ROW 句を使用します。トリガを文レベルのトリガとして宣言するには、FOR EACH STATEMENT 句を使用するか、または FOR EACH 句を省略します。わかりやすくするために、文レベルのトリガを宣言する場合、FOR EACH STATEMENT 句を入力することをおすすめします。
同じタイミング (before、after、resolve) で起動される同じタイプ (insert、update、delete) のトリガは、ORDER 句を使用して起動する順序を決定します。
REFERENCING OLD 句と REFERENCING NEW 句を使用すると、削除されたり挿入されたローを参照できます。この句の性格上、UPDATE は削除とそれに続く挿入として取り扱われます。
REFERENCING REMOTE 句は SQL Remote で使用します。これを使うと、UPDATE 文の VERIFY 句に設定されている値を参照できます。これは、必ずカラム・リストのトリガ RESOLVE UPDATE または RESOLVE UPDATE OF と一緒に使用してください。
REFERENCING OLD と REFERENCING NEW の意味は、トリガがロー・レベルのトリガと文レベルのトリガのどちらかによって異なります。ロー・レベルのトリガの場合、REFERENCING OLD 句を使うと、更新または削除する前のローの値を参照できます。また、REFERENCING NEW 句を使うと、挿入または更新された値を参照できます。OLD ローと NEW ローは、BEFORE と AFTER トリガの中で参照できます。REFERENCING NEW 句を使うと、BEFORE トリガの新しいローを修正してから、挿入または更新操作を行うことができます。
文レベルのトリガの場合、REFERENCING OLD と REFERENCING NEW 句は、ローの古い値と新しい値を保持している宣言されたテンポラリ・テーブルを参照します。これらのテーブルのデフォルト名は deleted と inserted です。
WHEN 句を使うと、探索条件が true と評価されたローに対してのみトリガが起動されます。
BEFORE UPDATE トリガは、ローを対象に UPDATE が実行されるたびに起動されます。この場合、新しい値が古い値と異なるかどうかは問題ではありません。一方、AFTER UPDATE トリガは、新しい値が古い値と異なる場合にのみ起動されます。
新しい部長が任命されたとき、その部の従業員の manager_id カラムを更新する例を示します。
CREATE TRIGGER tr_manager BEFORE UPDATE OF dept_head_id ON department REFERENCING OLD AS old_dept NEW AS new_dept FOR EACH ROW BEGIN UPDATE employee SET employee.manager_id=new_dept.dept_head_id WHERE employee.dept_id=old_dept.dept_id END
SQL Anywhere Studio 9.0.2
Copyright © 1989–2005 Sybase, Inc. Portions copyright © 2001–2005 iAnywhere Solutions, Inc. All rights reserved.