トリガによりデータベースのイベントに応じて実行されるアクションの集合を、表に定義することができます。ここでデータベースのイベントとは削除、挿入、更新処理のことです。 例えば表に削除へのトリガを定義した場合、そのトリガのアクションは表から行が削除されるときに実行されます。
制約と併せて、トリガによる波及的な削除や更新を定義することで、情報の整合性を保つことができます。 トリガで実現できる機能はこのほかにも、警告の呈示や、他の表の更新、e-mailの送信やその他の処理など、多岐にわたります。
ひとつの表に定義可能なトリガの数には、それらのトリガが同じイベントへのトリガであるか否かにかかわらず、上限はありません。
スキーマの所有者であるユーザであれば、そのスキーマにトリガを作成することができます。 所有していない表にトリガを定義するためには、その表にTRIGGER権限を持っていなければなりません。 データベースの所有者であるユーザであれば、どのスキーマのどの表に対してもトリガを作成することができます。
トリガはトリガが定義されている表とは異なるスキーマに定義することも可能です。
限定されたトリガ名のスキーマ名は、SYSで始まってはなりません。
CREATE TRIGGER トリガ名 { AFTER | NO CASCADE BEFORE } { INSERT | DELETE | UPDATE [ OF 列名 [, 列名]* ] } ON 表名 [ 参照節 ] [ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ] トリガされるSQL文
表のイベントごとに定義できるトリガの数に上限はありません。さらに更新へのトリガであれば、対象となる列を明示することができます。
発火の原因となったイベントで現在変更された情報をトリガされるSQL文から参照することは良くあることです。 また、トリガされるSQL文が参照しなければならないのは新しい値(変更後、後の値、と言うこともできます)である場合があります。
Derbyにて、発火した原因となったイベントにより変更された情報をトリガから参照する方法はひとつだけではありません。変更された情報はトリガされるSQL文から、遷移変数あるいは遷移表で参照することができます。 参照節にて遷移変数への相関名や別名を、OLD/NEW AS 相関名という書式で記述できます。
REFERENCING OLD AS DELETEDROW
DELETE FROM HotelAvailability WHERE hotel_id = DELETEDROW.hotel_id
文のトリガでは、遷移表をトリガされるSQL文やトリガの資格で参照可能です。 参照節にて参照表への相関名や別名を、OLD_TABLE/NEW_TABLE AS 相関名という書式で記述できます。
REFERENCING OLD_TABLE AS DeletedHotels
DELETE FROM HotelAvailability WHERE hotel_id IN (SELECT hotel_id FROM DeletedHotels)
参照節では、新しいものと古いものにそれぞれ一つまで、相関名あるいは識別子を定義できます。 また、行のトリガには遷移表の識別子を定義できない一方で、文のトリガには遷移変数の相関名を定義できません。
文のトリガはトリガのイベント毎に一回発火します。トリガの発火に挿入・更新・削除にて何行が変更されたかは関係ありません。
行のトリガはトリガのイベントが影響する行毎に一回発火します。影響が一行にも及ばなかった場合、トリガは発火しません。
トリガされるSQL文ではトリガが定義された表以外のデータベースの情報を参照することができます。それらのデータベースの情報が破棄されていた場合、トリガは無効となります。 次回の実行にてトリガの再コンパイルが失敗した場合、呼び出しは例外を投げて、トリガを発火させた文はロールバックされます。
トリガされるSQL文の詳細については、Derby ディベロッパーズ ガイドを参照してください。
同じ表に対して、同じイベントの、発火する時(トリガが前か後かという意味です。)が同じトリガが複数定義されていた場合、トリガは作成された順に実行されます。
-- 文とトリガ
CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x
FOR EACH ROW MODE DB2SQL
values app.notifyEmail('Jerry', 'Table x is about to be updated');
CREATE TRIGGER FLIGHTSDELETE
AFTER DELETE ON FLIGHTS
REFERENCING OLD_TABLE AS DELETEDFLIGHTS
FOR EACH STATEMENT
DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID IN
(SELECT FLIGHT_ID FROM DELETEDFLIGHTS);
CREATE TRIGGER FLIGHTSDELETE3
AFTER DELETE ON FLIGHTS
REFERENCING OLD AS OLD
FOR EACH ROW
DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;
トリガの再帰は最大16までです。