
CREATE TRIGGER 文(高度なトリガー)
FL 500 CREATE TRIGGER (上級) 文は、スキーマ内で上級トリガーを定義し、現在のサーバでトリガーパッケージを構築します。 トリガーが活動化するたびに、トリガー・パッケージは 1 回以上実行されます。
CREATE TRIGGERの呼び出し(上級者向け)
このステートメントは、対話式に発行することができます。 これは、DYNAMICRULES RUN動作が有効になっている場合にのみ、動的に準備できる実行可能なステートメントです。 詳細は、「Authorization IDs and dynamic SQL」 を参照してください。
CREATE TRIGGER(上級)の権限
明示的スキーマまたは暗黙的スキーマで新しいトリガーを作成する場合、後述する特権セットに、 少なくとも次のいずれかが含まれていなければなりません。
- スキーマに対する CREATEIN 特権
- システム DBADM 権限
- SYSCTRL 権限
- SYSADM 権限
- インストール SYSOPR 権限 (プロセスの現行 SQLID が SYSINSTL に設定されている場合)
VERSION句を指定せずにトリガを置き換えるには、以下に定義されている権限セットに、以下のうち少なくとも1つを含める必要があります
- トリガーの所有権
- DATAACCESS権限と、以下のうち少なくとも1つ:
- スキーマ上のDROPINおよびCREATEIN権限
- システム DBADM 権限
- SYSCTRL 権限
- SYSADM 権限
さらに、表の既存のトリガーを作成または置換するには、以下に定義する特権セットに、少なくとも以下のいずれかが含まれている必要があります。 
- トリガーが定義されている表に対する TRIGGER 特権
- トリガーが定義されている表に対する ALTER 特権
- 表を含むデータベースに対する DBADM 権限
- システム DBADM 権限
- SYSCTRL 権限
- SYSADM 権限
- インストール SYSOPR 権限 (プロセスの現行 SQLID が SYSINSTL に設定されている場合)
データベースが暗黙的に作成される場合、データベース特権は暗黙的なデータベースまたは DSNDB04 上になければなりません。
VERSION句を使用して既存のトリガーのバージョンを追加または置き換えるには、以下に定義されている権限セットに、以下のうち少なくとも1つを含める必要があります。
- トリガーの所有権
- データアクセス権限および
- スキーマに対する ALTERIN 特権
- システム DBADM 権限
- SYSCTRL 権限
- SYSADM 権限
以下の場合には、追加の特権が必要になることがあります。
- トリガー本体を実行するには、トリガーの所有者はSYSADM権限、DATAACCESS権限、または以下の各権限のいずれかを持っている必要があります
- トリガが定義されているテーブルまたはビューに対するSELECT権限
- triggered-action の search-condition で参照される表またはビューに対する SELECT 特権
SQLトリガー本体のステートメントを実行するために必要な権限
- SECUREDオプションが指定されている場合、SECADM権限またはCREATE_SECURE_OBJECT権限が必要です。注: SECURITYサブシステムパラメータがNOに設定されている場合、SYSADM権限には暗黙的にSECADM権限が付与されます。
- WLM ENVIRONMENT FOR DEBUG MODE 節が指定されている場合、 RACF® または外部セキュリティ製品が起動され、WLM 環境でプログラムを定義するのに必要な権限がチェックされます。 RACF で WLM 環境へのアクセスが保護されている場合、CREATE 文を発行したユーザーには必要な権限が必要です。 詳細については、「WLM環境におけるストアドプロシージャ作成の権限管理 」を参照してください。
- トリガー定義の内容によっては、SYSDUMMYx 表に追加の許可が必要になる場合があります。 SYSDUMMYx 表を参照してください。
特権セット:
特権セットは、プロセスの SQL 許可 ID が持つ特権となります。ただし、プロセスがトラステッド・コンテキスト内にあり、ROLE AS OBJECT OWNER 文節が指定された場合を除きます。 その場合には、特権セットは、プロセスの 1 次許可 ID と関連するロールが持つ特権となり、所有者はそのロールになります。
CREATE TRIGGER の構文(上級者向け)
トリガ定義
trigger-activation-time
trigger-event
trigger-granularity
triggered-action
SQL トリガー本体
トリガーされたSQLステートメント:
option-list: (この各オプションを任意の順序で指定できますが、各々を指定できるのは 1 回限りです。)
CREATE TRIGGER の説明(上級者向け)
OR REPLACE
トリガーの定義が現行のサーバー上に存在している場合に、そのトリガーの定義を置換または変更するために指定します。 トリガーの定義が現行のサーバーにない場合は、このオプションは無視されます。VERSION キーワードが指定されず、トリガーがまだ存在していない場合、トリガーはトリガーの初期バージョン (V1) で作成されます。
VERSION キーワードが指定されず、トリガーが存在していない場合、次のようになります。- 既存のトリガーは、複数のバージョン、またはバージョン ID が V1 ではない単一のバージョンで定義されていてはなりません。
- そうではなく、現在存在する唯一のバージョンが V1 (またはトリガーが基本トリガー) である場合、トリガーは次のように再作成されます。
- 既存の定義が実際にドロップされてから、カタログ内で定義が置き換えられます。
- 既存のコメントは破棄されます。
- トリガーの定義 (オブジェクト所有者とターゲットの表またはビューの名前を含む) を変更できます。
- トリガー定義に関連付けられているタイム・スタンプは更新されます。
- トリガーの作成時刻が変更され、トリガーの活動化順序は維持されません。
VERSION キーワードが指定され、指定されたバージョンのトリガーが存在している場合、ALTER TRIGGER ステートメントに REPLACE VERSION 文節を指定して発行する場合と同様に、カタログでバージョンが実際に置換されます。 トリガーの所有者と起動順序は変更されない。
トリガのバージョンを置き換える時、以下のトリガ属性は、現在アクティブなバージョンのトリガの対応する属性と同じでなければなりません: trigger-activation-time、trigger-event、table or view name、 trigger-granularity。 REFERENCING 文節の内容は、トリガーの他のバージョンと異なっていても構いません。 明示的に指定されていないオプションの場合、置き換え対象のトリガー・バージョンに対してそれらのオプションが明示的に指定されていても、それらのオプションに対するシステム・デフォルト値が使用されます。 このことは、DISABLE DEBUG MODE を指定したトリガー・バージョンに対しては当てはまりません。 トリガーのバージョンに対して DISABLE DEBUG MODE が指定されていると、REPLACE 文節を使用してオプションを変更することはできません。
VERSION キーワードが指定され、指定されたバージョンのトリガーが存在していない場合、ALTER TRIGGER ステートメントに ADD VERSION 文節を指定して発行する場合と同様に、バージョンが定義されます。 トリガーの所有者と起動順序は変更されない。 
トリガの新しいバージョンを追加する時、以下のトリガ属性は、現在アクティブなバージョンのトリガの対応する属性と同じでなければなりません: trigger-activation-time、trigger-event、 table or view name、 trigger-granularity。 REFERENCING 文節の内容は、トリガーの他のバージョンと異なっていても構いません。 明示的に指定されていないオプションの場合、それらのオプションのシステム・デフォルト値が使用されます。

- トリガ名
トリガーの名前を指定します。 名前は、暗黙的または明示的スキーマ名も含めて、
現行サーバーに存在するトリガーを示すものであってはなりません。 しかし、以下の状況では、既存のトリガーの名前を指定することができます:

- 既存のトリガーを置き換えるために OR REPLACE 節が指定されている場合
- 既存のトリガーのバージョンを追加または置換するために VERSION 節が指定されている場合

この名前は、トリガー・パッケージの作成にも使用されるので、OR REPLACE が指定されない場合は、この名前は、カタログで既に記述されているパッケージを示すものであってもなりません。 スキーマ名は、トリガー・パッケージの collection-id oになります。 trigger-name は通常 ID あるいは区切り ID として指定できますが、この名前は通常 ID に関する規則に準拠している必要があります。 詳細は、 暗黙的に作成されるトリガパッケージを参照してください。
特権セットにSYSCTRL特権が含まれている場合、スキーマ名は'SYSTOOLS'とすることができる。 そうでなければ、スキーマ名が'SYSADM'、'SYSIBMADM'、'SYSPROC'でない限り、スキーマ名は'SYS'で始まってはならない。
VERSION トリガーバージョンID
定義または置換の対象のトリガーのバージョンのバージョン ID を指定します。 トリガーのバージョンID の指定に関する情報は、「SQLにおける命名規則」 を参照してください。 ADD VERSION 文節指定の ALTER TRIGGER ステートメント、または OR REPLACE 文節指定の CREATE TRIGGER ステートメントを使用して、トリガーの追加バージョンを作成できます。 V1 がデフォルトのバージョン ID です。 トリガーのバージョンの使用についての詳細は、 トリガーのバージョンを参照して下さい。
trigger-activation-time

- NO CASCADE
- NO CASCADE には、以前のリリースや他の製品との互換性があります。
- 前
- トリガーが BEFORE トリガーであることを指定します。 Db2 対象テーブルへの挿入、削除、更新操作によって引き起こされた変更を適用する前に、トリガーされたアクションを実行します。 また、トリガー・アクションによって他のトリガーが活動化されることはないことも指定します。これは、BEFORE トリガーのトリガー・アクションには更新、REFRESH TABLE、または TRUNCATE の SQL ステートメントを入れることができないためです。
view-name も指定時には、BEFORE を指定してはいけません。 BEFORE トリガーには FOR EACH ROW を指定してください。
- AFTER
- トリガーが AFTER トリガーであることを指定します。 Db2 対象テーブルへの挿入、削除、または更新操作によって生じた変更を適用した後、トリガーされたアクションを実行します。 view-name が指定されている場合は、after を指定してはいけません。
- INSTEAD OF
- トリガーが INSTEAD OF トリガーであることを指定します。 関連したトリガー・アクションは、サブジェクト・ビューに対するアクションを置換します。 指定されたサブジェクト・ビューにおいては、INSTEAD OF トリガーが 1 つだけ、各操作タイプに使用可能です。 Db2 対象ビューに対する挿入、更新、または削除操作の代わりにトリガーされたアクションを実行します。
テーブル名(table-name )が指定されている場合は、INSTEAD OFを指定してはならない。 INSTEAD OF トリガーの場合は、WHEN 文節を指定することはできません。 INSTEAD OF トリガーには FOR EACH ROW を指定する必要があります。

- ON テーブル名
- BEFORE または AFTER トリガー定義のサブジェクト表を指定します。 この名前は、現行サーバーに存在する基本表を示すものでなければなりません。
マテリアライズド・クエリ・テーブル、クローン・テーブル、一時テーブル、補助テーブル、エイリアス、シノニム、リアルタイム統計テーブル、アクセラレータ専用テーブル、カタログ・テーブル、ディレクトリ・テーブルを識別してはならない。
- ON ビュー名
- INSTEAD OF トリガー定義のサブジェクト・ビューを指定します。 この名前は、現行サーバーに存在するビューを示すものでなければなりません。
view-name では、次のどの条件を満足する場合も、ビューを指定しないでください。
- WITH CASCADED CHECK オプション (シンメトリック・ビュー) 付きで定義されているビュー
- シンメトリック・ビューが定義されているビュー
- 異なるコード化スキームまたは CCSID 値を使用してエンコードされたデータを参照するビュー
- ROWID 列である列を持つビュー
- 次のいずれかのタイプの基礎となる列に基づく列を持つビュー
- A LOB、XML、または ROWID 列
- ID 列
- セキュリティー・ラベル列
- 行変更タイム・スタンプ列
- 行開始列
- 行終了列
- トランザクション開始 ID 列
- フィールド・プロシージャーを持つ列があるビュー
- すべての基礎表がカタログ表であるビュー
- すべての基礎表が作成済みのグローバル一時表であるビュー
- すべての基礎表がクローン表であるビュー
- 他のビューが従属しているビュー
- REFERENCING
- 遷移変数の相関名および遷移表の表名を指定します。 トリガー SQL 操作 (挿入、削除、
または更新) によって変更された対象表の行の場合、相関名は特定行の列を示します。 table-identifier には、影響を受ける行の完全セットを指定します。 XML タイプを持つ遷移変数は、トリガー内部で参照できません。 遷移表の列を参照する場合、その列のデータ・タイプを XML にすることはできません。
correlation-names を次のように指定して列名を修飾することにより、トリガー SQL 操作の影響を受けるそれぞれの行をトリガー・アクションが使用できるようになります。
相関名として OLD ROW
トリガー SQL 操作に先立って、行の値を含む遷移変数を示す相関名を指定します。
相関名として新しい行
トリガー SQL 操作、および既に実行されている BEFORE トリガーの割り当てステートメントによって変更された行の値を含む遷移変数を示す相関名を指定します。
OLD と NEW の両方が指定される場合、遷移変数への参照は、関連する相関名で修飾する必要があります。
トリガー操作の影響を受ける行の完全セットをトリガー・アクションに対する遷移表として使用できます。 遷移表を参照するには、次のように table-identifier を指定します。
- OLD_TABLE AS 表識別子
- 実際に変更する前に、トリガー SQL 操作によって変更された行の完全セットの値を示す一時表の名前を指定します。
NEW_TABLE AS テーブル識別子
トリガー SQL 操作、および既に実行されている BEFORE トリガーの割り当てステートメントによって変更された行の完全セットの値を示す、一時表の名前を指定します。 
OLD と NEW の correlation-name は、トリガーに対してそれぞれ 1 つだけ指定できます。 OLD_TABLE と NEW_TABLE の table-identifier は、トリガーに対してそれぞれ 1 つだけ指定できます。 correlation-names と table-identifiers は、すべて互いに固有であることが必要です。
表1は、さまざまなトリガータイプに対して指定できる遷移変数と遷移テーブルの許容可能な組み合わせをまとめたものです。 OLD correlation-name と OLD_TABLE table-identifier は、トリガー・イベントが削除操作または更新操作である場合のみ有効です。 削除操作の場合、OLD correlation-name は削除される行の列の値を取り込み、OLD_TABLE table-identifier は削除される行のセットにある値を取り込みます。 更新操作の場合、OLD correlation-name は行の列の値を更新操作前の状態で取り込み、OLD_TABLE table-identifier は行のセットの値を更新操作前の状態で取り込みます。
NEW 相関名と NEW_TABLE テーブル識別子は、トリガー・イベントが挿入操作または更新操作の場合にのみ有効です。 どちらの操作の場合も、NEW correlation-name は挿入または更新される行の列の値を取り込み、NEW_TABLE table-identifier は挿入または更新される行のセットにある値を取り込みます。 BEFORE トリガーの場合、更新される行の値には、BEFORE トリガーのトリガー・アクションにある割り当てステートメントによる変更が加えられます。
表 1. トリガー定義において許される属性の組み合わせ 細分度 アクティブ化時点 トリガー SQL 操作 移行変数許可 1 移行表が許可された1 FOR EACH ROW 前 DELETE OLD なし INSERT NEW なし UPDATE OLD、NEW なし AFTER DELETE OLD OLD_TABLE INSERT NEW NEW_TABLE UPDATE OLD、NEW OLD_TABLE、 NEW_TABLE INSTEAD OF DELETE OLD OLD_TABLE INSERT NEW NEW_TABLE UPDATE OLD、NEW OLD_TABLE、 NEW_TABLE FOR EACH STATEMENT AFTER DELETE なし OLD_TABLE INSERT なし NEW_TABLE UPDATE なし OLD_TABLE、 NEW_TABLE 注:- 遷移表や遷移変数が許されていないところで参照されるとエラーが戻されます。
文字データ・タイプを持つ遷移変数は、サブジェクト表の列のサブタイプと CCSID を継承します。 トリガー・アクションの実行中、遷移変数はホスト変数と同様に 扱われます。 したがって、文字変換が行われる可能性があります。 ただし、ホスト変数とは異なり、遷移変数はビット・データ属性を持つことができ、 ビット・データに対しては文字変換が行われません。 遷移変数は、その変数が対応する表の列がビット・データの場合に、ビット・デー タであると見なされます。
遷移表は読み取り専用なので変更できません。 遷移表は、サブジェクト表の編集プロシージャーまたは検証プロシージャーは継承しませんが、サブジェクト表のコード化スキームとフィールド・プロシージャーは継承します。
それぞれの correlation-name、およびそれぞれの table-identifier の有効範囲は、トリガー定義全体です。
- trigger-granularity
- FOR EACH ROW または FOR EACH STATEMENT
- Db2 がトリガーされたアクションを実行する条件を指定します。
- FOR EACH ROW
- Db2 が、トリガーとなるSQL操作によって変更された対象テーブルの各行に対してトリガーアクションを実行することを指定します。 トリガー SQL 操作では行を変更しないので、トリガー・アクションは実行されません。
- FOR EACH STATEMENT
- Db2 がトリガー操作に対してトリガーされたアクションを1回のみ実行することを指定します。 運用トリガー操作がどの行も変更または削除しない場合でも、
トリガー・アクションは 1 回実行されます。
FOR EACH STATEMENT は、BEFORE トリガーまたは INSTEAD OF トリガーに指定してはいけません。
- FOR EACH ROW または FOR EACH STATEMENT
- Db2 がトリガーされたアクションを実行する条件を指定します。
- FOR EACH ROW
- Db2 が、トリガーとなるSQL操作によって変更された対象テーブルの各行に対してトリガーアクションを実行することを指定します。 トリガー SQL 操作では行を変更しないので、トリガー・アクションは実行されません。
- FOR EACH STATEMENT
- Db2 がトリガー操作に対してトリガーされたアクションを1回のみ実行することを指定します。 運用トリガー操作がどの行も変更または削除しない場合でも、
トリガー・アクションは 1 回実行されます。
FOR EACH STATEMENT は、BEFORE トリガーまたは INSTEAD OF トリガーに指定してはいけません。
ALLOW DEBUG MODE、DISALLOW DEBUG MODE、
または DISABLE DEBUG MODE
このバージョンのトリガーがデバッグ・モードで実行できるかどうかを指定します。 このデフォルトは、CURRENT DEBUG MODE 特殊レジスターの値を使用して決まります。- ALLOW DEBUG MODE
- このバージョンのトリガーがデバッグ・モードで実行できることを指定します。 ALLOW DEBUG MODE が有効な場合は、WLM 環境が使用可能でなければなりません。 WLM ENVIRONMENT FOR DEBUG MODE が指定されていない場合、Db2はインストール時に指定されたデフォルトの WLM が確立したストアード・プロシージャー・アドレス・スペースを使用します。
- DISALLOW DEBUG MODE
- このバージョンのトリガーがデバッグ・モードで実行できないことを指定します。 ALTER ステートメントを使用して、この初期バージョンのトリガーに対してこのオプションを ALLOW DEBUG MODE に変更することができます。 DISALLOW DEBUG MODE が有効な場合は、WLM 環境が使用可能でなければなりません。 WLM ENVIRONMENT FOR DEBUG MODE が指定されていない場合、Db2はインストール時に指定されたデフォルトの WLM が確立したストアード・プロシージャー・アドレス・スペースを使用します。
- DISABLE DEBUG MODE
- このバージョンのトリガーがデバッグ・モードで実行できないことを指定します。
このトリガー・バージョンが DISABLE DEBUG MODE を使用して作成済みまたは変更済みの後では、ALLOW DEBUG MODE または DISALLOW DEBUG MODE を指定するようにこのバージョンのトリガーを変更できません。 このオプションを変更するには、トリガーをドロップし、必要なオプションを使用してトリガーを再作成してください。 トリガーのドロップと再作成のための代替方法は、必要なオプションを使ってそのトリガー・バージョンを作成し、そのバージョンをアクティブ・バージョンにすることです。
DISABLE DEBUG MODE が有効な場合、WLM ENVIRONMENT FOR DEBUG MODE は無視されます。

QUALIFIER スキーマ名
トリガー本体で参照される非修飾オブジェクト名に使用される暗黙的な修飾子を指定します。 このオプションのデフォルトの決定方法については、「 修飾されていないエイリアス、インデックス、JARファイル、マスク、権限、シーケンス、テーブル、トリガ、およびビュー名 」を参照してください。 
- ASUTIME
- このバージョンのトリガーの 1 回の呼び出しで使用できるプロセッサー時間の合計量を、CPU サービス単位で指定します。 この値は、リソース限定表の ASUTIME 列とは無関係です。
トリガーのデバッグ時、この時間制限を設定すると、トリガーがループ状態になった時に役立ちます。 サービス・ユニットについては、 z/OS MVS 『Initialization and Tuning Guide(初期化およびチューニング・ガイド) 』を参照のこと。
- NO LIMIT
- サービス単位に関して制限がないことを指定します。
NO LIMIT がデフォルトです。
- LIMIT 整数
- CPUサービスユニットの数の制限は、1~2147483647の範囲の正の整数です。 トリガーが指定値よりも多くのサービスユニットを使用した場合、 Db2 はトリガーをキャンセルします。 トリガーの並列タスクによって使用される CPU サイクルは、指定された ASUTIME LIMIT には提供されません。
デバッグモードのWLM環境名
トリガのデバッグ時に Db2 で使用される WLM (ワークロードマネージャ) アプリケーション環境を指定します。 WLM 環境の名前は SQL ID です。WLM ENVIRONMENT FOR DEBUG MODE が指定されていない場合、Db2はインストール時に指定されたデフォルトの WLM が確立したストアード・プロシージャー・アドレス・スペースを使用します。
WLM アプリケーション環境に対して適切な権限を持っている必要があります。
DISABLE DEBUG MODE が有効な場合は、WLM ENVIRONMENT FOR DEBUG MODE 値は無視されます。

CURRENT DATA YES または CURRENT DATA NO
カーソル固定の分離レベルが有効であるときに、読み取り専用カーソルおよび未確定カーソルに対してデータの現行性が必要であるかどうかを指定します。 CURRENT DATA は、分散の未確定カーソルに対してブロック・
フェッチが使用できるかどうかも判別します。- CURRENT DATA YES
- 読み取り専用カーソルおよび未確定カーソルに対してデータの現行性が必要であることを指定します。 Db2 データの最新性を確保するために、ページまたは行ロックを取得します。 ブロック・フェッチは、分散の未確定カーソルに対して無視されます。
- CURRENT DATA NO
- 読み取り専用カーソルおよび未確定カーソルに対してデータの現行性が必要でないことを指定します。 ブロック・フェッチは、分散の未確定カーソルに対して使用できます。 未確定カーソルのオープン後、トリガーがその未確定カーソルに対して DELETE WHERE CURRENT OF ステートメントを動的に準備し実行しようとする場合は、CURRENT DATA NO を使用することはお勧めできません。 ご使用のトリガーが以下のいずれかのカーソルに対して DELETE WHERE CURRENT OF ステートメントを使おうとすると、エラーを受け取ります。
- ブロック・フェッチを使用しているカーソル
- 照会並列処理を使用しているカーソル
- このアプリケーション・プロセスまたは他のアプリケーション・プロセスで 修正される行に位置付けられたカーソル
CURRENT DATA NO がデフォルトです。

- CONCURRENT ACCESS RESOLUTION
- コミット済みのデータのみを処理で使用するかどうか、または更新中であるデータのコミットまたはロールバックを待機するかどうかを指定します。
- WAIT FOR OUTCOME
- 更新中であるデータのコミットまたはロールバックを処理で待機することを指定します。
- USE CURRENTLY COMMITTED
- 更新処理中のデータを検出したときに現在のコミット済みバージョンのデータを処理で使用することを指定します。 USE
CURRENTLY COMMITTED ユニバーサル・テーブル・スペースで定義され、行またはページレベルのロックサイズを持つテーブルにアクセスするスキャンに適用されます。
読み取りトランザクションと挿入トランザクションの間でロックの競合が発生した場合、 USE CURRENTLY COMMITTED 分離レベルがCSまたはRSのスキャンに適用されます。 適用できるスキャンには、読み取り専用および未確定照会および更新可能カーソルのインテント読み取りスキャンが含まれます。 USE CURRENTLY COMMITTED UPDATEまたはDELETE文のWHERE句から開始されたスキャン、およびINSERT文のサブセレクトにも適用されます。
ロック競合が発生するのは、読み取りトランザクションと削除トランザクションの間で、 USE CURRENTLY COMMITTED 分離レベルがCSのスキャンに適用され、CURRENT DATA NOが指定されている場合です。
DYNAMICRULES
実行時に、以下の動的 SQL 属性に対して適用する値を指定します。- 許可の検査に使用される許可 ID
- 非修飾オブジェクトに使用される修飾子
- Db2が動的 SQL ステートメントを構文解析および意味的に検査するために使用するアプリケーション・プログラミング・オプションのソース
トリガーのコンテキストでは、DYNAMICRULES は、動的 SQL ステートメントに ALTER、CREATE、および DROP ステートメントを含めることができるかどうかも指定します。
DYNAMICRULES 文節の値に加えて、トリガーの実行時環境は、実行時における動的 SQL ステートメントの動きを制御します。 DYNAMICRULES 値と実行時環境の組み合わせにより、動的 SQL 属性の値が決定されます。 その属性値の集合が、動的 SQL ステートメントの振る舞いと呼ばれます。 次の値が指定可能です。- RUN
- 動的 SQL ステートメントが「実行動作」を使用して処理されることを指定します。
RUN がデフォルトです。
- BIND
- 動的 SQL ステートメントが「バインド動作」を使用して処理されることを指定します。

APPLICATION ENCODING SCHEME
トリガー本体内の静的 SQL ステートメントにある SQL 変数に対して、デフォルトのコード化スキームを指定します。 この変数が使用されるのは、CCSID 文節がデータ・タイプの一部として無指定の場合に、コンパウンド・ステートメントで SQL 変数を定義するためです。- ASCII
- サーバーの ASCII CCSID を使用して、データをエンコードすることを指定します。
- EBCDIC
- サーバーの EBCDIC CCSID を使用して、データをエンコードすることを指定します。
- ユニコード
- サーバーの Unicode CCSID を使用して、データをエンコードすることを指定します。
このオプションのデフォルト値がどのように決定されるかについては、「ENCODING バインドオプション」 を参照してください。

WITH EXPLAIN または WITHOUT EXPLAIN
トリガー内の SQL ステートメントの実行方法について、情報を提供するかどうかを指定します。- WITHOUT EXPLAIN
- トリガー内の SQL ステートメントの実行方法について、情報が提供されないことを指定します。
WITHOUT EXPLAIN を使って指定したトリガーに組み込まれたあるステートメントに対して、EXPLAIN 出力を入手できます。これを行うには、トリガー本体に SQL ステートメント EXPLAIN を組み込みます。 それ以外の場合には、EXPLAIN オプションの値が、トリガー本体のすべての EXPLAIN 可能 SQL ステートメント、およびすべての DECLARE CURSOR ステートメントの全選択部分に対して適用されます。
WITHOUT EXPLAIN がデフォルトです。
- WITH EXPLAIN
- トリガー内の SQL ステートメントの実行方法について、情報が提供されることを指定します。 情報は表 owner に挿入されます。 PLAN_TABLE。 owner は、トリガーの所有者の許可 ID です。 あるいは、トリガーの所有者の許可 ID が、基本表 PLAN_TABLE を示す owner.PLAN_TABLE という別名を持つことができます。 また、owner はその表に関して適切な SELECT 特権および INSERT 特権を持つ必要があります。 PLAN_TABLE は基本表を持つ必要があり、
同じ表名 (PLAN_TABLE) が付いた複数の別名を持つことができますが、スキーマ修飾子は異なります。
ビューやシノニムであってはならず、CREATE文が処理される前に存在していなければなりません。
owner.PLAN_TABLEへのすべての挿入において、QUERYNOの値は、 Db2 によって割り当てられるステートメント番号である。また、WITH EXPLAIN オプションは、2 つのオプション表 DSN_STATEMNT_TABLE および DSN_FUNCTION_TABLE (もし存在すれば) にデータを追加します。 DSN_STATEMNT_TABLE には、SQL ステートメントの処理コストの見積値が含まれています。 詳細は 「SQL文のコストの見積もり 」を参照してください。 DSN_FUNCTION_TABLE には、関数解決についての情報が入ります。 詳細は、「DSN_FUNCTION_TABLE を使用して Db2 がどのように機能するかをチェックする 」を参照してください。
EXPLAIN文の詳細については、WITH EXPLAINオプションで入力されるテーブルの説明も含めて、 EXPLAIN文を参照してください。

WITH IMMEDIATE WRITE または WITHOUT IMMEDIATE WRITE
グループ・バッファー・プールの従属ページ・セットまたは従属パーティションに行われる更新に対して、即時書き込みが実行されるかどうかを指定します。 このオプションは、データ共用環境にのみ適用されます。 IMMEDWRITE サブシステム・パラメーターにはこのオプションの影響はありません。 IMMEDWRITE バインドオプションは、実行時間に影響を与える IMMEDWRITE バインドオプションの暗黙的な階層構造(このトリガーオプションと類似)を示します。- WITHOUT IMMEDIATE WRITE
- 通常の書き込みアクティビティーを行うように指定します。 グループ・バッファー・プールに従属している更新されたページは、フェーズ 1 コミット時点またはフェーズ 1 コミットの前、あるいは、ロールバックされているトランザクションのアボート終了後に書き込まれます。
WITHOUT IMMEDIATE WRITE がデフォルトです。
- WITH IMMEDIATE WRITE
- グループ・バッファー・プールに従属する更新ページが バッファーの更新完了後すぐに書き込まれることを指定します。 バッファーが、トランザクションのフォワード処理中、もしくはトランザクションのロールバック処理中に更新された場合であっても、更新されたページは即時に書き込まれます。 WITH IMMEDIATE WRITE はパフォーマンスに影響する可能性があります。

ISOLATION LEVEL RR、RS、CS、または UR
トリガーを、他の実行中のアプリケーションの影響からどの程度分離するかを指定します。 分離レベルに関する情報は、「ISOLATIONオプションの選択」 を参照してください。- RR
- 反復可能読み取りを指定します。
- RS
- 読み取り固定を指定します。
- CS
- カーソル固定を指定します。 CS がデフォルトです。
- UR
- 非コミット読み取りを指定します。

OPTHINT 文字列定数
トリガー本体に含まれている静的 SQL ステートメントに対して、照会の最適化ヒントを使用するかどうかを指定します。string-constant は、最大128バイトの文字列であり、 Db2 サブシステムが入力として使用する行をPLAN_TABLEで検索する際に使用されます。 デフォルト値は空文字列であり、 Db2 サブシステムが静的SQL文に対して最適化ヒントを使用しないことを示します。
最適化ヒントを使用するのは、ご使用のシステムで最適化ヒントが使用可能な場合に限ります。 最適化ヒントを有効にする方法については、「アクセス経路に影響を与えるための準備 」を参照してください。

SQL PATH
Db2 、トリガ本体内の修飾されていないユーザ定義型、関数、プロシージャ名を解決するために使用するSQLパスを指定します。 デフォルト値は 「SYSIBM」、「SYSFUN」、「SYSPROC」、「SYSIBMADM 」、およびQUALIFIERオプションの値です。スキーマ 「SYSIBM」、「SYSFUN」、「SYSPROC」、「SYSIBMADM」 は明示的に指定する必要はありません。 これらのスキーマのいずれも明示的に指定されない場合、リスト順で SQL パスの最初でそれが暗黙的に想定されます。
Db2 指定された各スキーマ名を取り、末尾の空白を削除し、その周りに2つの区切り文字を追加し、最後のものを除いて各スキーマ名の後にカンマを1つ追加することで、長さを計算します。 結果としてのストリングの長さは、CURRENT SCHEMA 特殊レジスターの長さを超えてはなりません。 「SYSIBM」、「SYSFUN」、「SYSPROC」、「SYSIBMADM 」スキーマを指定しない場合、それらはSQLパスの長さに含まれません。 SQLパスの合計長がCURRENT PATH特殊レジスタの長さを超える場合、 Db2 はエラーを返します。
詳しくは、以下を参照してください。
- schema-name
- スキーマを識別します。 Db2 CREATE文が処理される際に、スキーマが存在することを検証しません。 同一スキーマ名は、スキーマ名のリストに複数回現れてはなりません。
SQL パスに SYSPUBLIC を指定することはできません。
- SYSTEM PATH
- スキーマ名 「SYSIBM」、「SYSFUN」、「SYSPROC」、「SYSIBMADM」 を指定します。
- SESSION_USER または USER
- SESSION_USER または USER の特殊レジスター値を指定します。この値は、最大 8 バイト (EBCDIC で) の schema-name を表します。 CREATE ステートメントの処理時、この長さは、SQL PATH オプションに対して指定したスキーマ名のリストの合計長に含まれます。
スキーマ名のリストで SESSION_USER (または USER) を指定する場合、SESSION_USER (または USER) キーワードの前後に区切り文字を使用しないでください。

RELEASE AT
トリガーが使用するリソースを解放する時点 (各コミット・ポイントまたはトリガーの終了時点のいずれか) を指定します。- COMMIT
- リソースが各コミット・ポイントで解放されることを示します。
COMMIT がデフォルトです。
- DEALLOCATE
- リソースがスレッドの終了時点でのみで解放されることを指定します。 DEALLOCATE は動的 SQL ステートメントに影響しません。この SQL ステートメントは、常に、RELEASE AT COMMIT を使用します。ただし、次の例外があります。RELEASE AT DEALLOCATE 文節と WITH KEEP DYNAMIC 文節を使用して、かつ、このサブシステムがインストール・パネル DSNTIP8 のフィールド「CACHE DYNAMIC SQL」に対して「YES」の値を指定してインストールされている場合、RELEASE AT DEALLOCATE オプションが動的 SELECT とデータ変更ステートメントに対して引き受けられます。
動的ステートメントのために獲得されたロックは、以下のいずれかのイベントが発生したユニットで保持されます。
- アプリケーション・プロセスが終了する。
- アプリケーション処理が、同じステートメント ID をもつ PREPARE ステートメントを発行する。 (ロックは次のコミット・ポイントで解除されます)。
- その文は使用されていないため、動的な文キャッシュから削除されます。 (ロックは次のコミット・ポイントで解放される)
- ステートメントが従属しているオブジェクトがドロップされるか変更される、もしくはステートメントが必要とする特権が取り消される。 (ロックは次のコミット・ポイントで解放される)
RELEASE AT DEALLOCATE はパッケージまたはプランのサイズを増加させる可能性があります。その理由は、追加項目がパッケージまたはプランの中に入ってくるからです。
詳細は、「RELEASEオプションの選択」 を参照してください。

ROUNDING
DECFLOAT データの操作に対して丸めモードを指定します。 デフォルト値は、アプリケーション・プログラミングのデフォルト・モジュールの中の DEFAULT DECIMAL FLOATING POINT ROUNDING MODE から取り出されます。- DEC_ROUND_CEILING
- 数値は正の無限大に近い方の値に丸められることを指定します。
- DEC_ROUND_DOWN
- 数値は 0 に近い方の値に丸められる (切り捨て) ことを指定します。
- DEC_ROUND_FLOOR
- 数値は負の無限大に近い方の値に丸められることを指定します。
- DEC_ROUND_HALF_DOWN
- 数値は最も近い値に丸められることを指定します。両側の値と等距離の場合は、切り捨てられます。
- DEC_ROUND_HALF_EVEN
- 数値は最も近い値に丸められることを指定します。両側の値と等距離の場合は、最終桁が偶数になるように丸められます。
- DEC_ROUND_HALF_UP
- 数値は最も近い値に丸められることを指定します。両側の値と等距離の場合は、切り上げられます。
- DEC_ROUND_UP
- 数値は 0 から離れた方の値に丸められることを指定します。

DATE FORMAT ISO、EUR、USA、JIS、または LOCAL
日付または時刻の値のストリング表記である結果値に対して日付形式を指定します。 詳細は、datetime 値の文字列表現を参照してください。デフォルトの形式は、ルーチンが定義されるシステムのインストール・パネル DSNTIP4 の DATE FORMAT フィールドで指定されます。 LOCAL オプションは、日付出口ルーチンが用意されていなければ、使用でき ません。

DECIMAL(15)、DECIMAL(31)、DECIMAL(15,s )、またはDECIMAL(31,s )
10 進算術演算で使用される最大精度を指定します。 詳細は 「2つの小数演算子を持つ算術演算 」を参照してください。 デフォルトの形式は、ルーチンが定義されるシステムのインストール・パネル DSNTIPF の DECIMAL ARITHMETIC フィールドで指定されます。 pp. sが指定された場合、 sは 1〜9の範囲の数値でなければならない。
TIME FORMAT ISO、EUR、USA、JIS、または LOCAL
日付または時刻の値のストリング表記である結果値に対して時刻形式を指定します。 詳細は、datetime 値の文字列表現を参照してください。デフォルトの形式は、ルーチンが定義されるシステムのインストール・パネル DSNTIP4 の TIME FORMAT フィールドで指定されます。 LOCAL オプションは、日付出口ルーチンが用意されていなければ、使用でき ません。

FOR UPDATE CLAUSE OPTIONAL または FOR UPDATE CLAUSE REQUIRED
カーソルを使用して位置指定更新を
実行する場合に、DECLARE CURSOR ステートメントに対して FOR UPDATE 文節が必要かどうかを指定します。- FOR UPDATE CLAUSE REQUIRED
- 位置指定更新を行うためにカーソルを使用する場合、FOR UPDATE 文節をカーソル定義の一部として指定する必要があることを指定します。
FOR UPDATE CLAUSE REQUIRED がデフォルトです。
- FOR UPDATE CLAUSE OPTIONAL
- 位置指定更新にカーソルを使用する場合に、FOR UPDATE 文節は指定する必要がないことを示します。 トリガー本体には、 ユーザーに対して更新許可された列の更新を行う、位置指定 UPDATE ステートメントを含めることができます。

- NOT SECURED または SECURED
- トリガーがセキュアであるとみなされるかどうかを指定します。 NOT SECURED がデフォルトです。
- SECURED
- トリガーがセキュアであるとみなされることを指定します。
トリガーのサブジェクト表が行アクセス制御または列アクセス制御を使用している場合は、トリガーに SECURED を指定する必要があります。 ビュー定義の 1 つ以上の基礎表で行アクセス制御または列アクセス制御が使用される場合、ビューに対して作成されるトリガーにも SECURED を指定する必要があります。
- NOT SECURED
- トリガーがセキュアでないとみなされることを指定します。
NOT SECURED は、そのサブジェクト表が行アクセス制御または列アクセス制御を使用しているトリガーに指定してはなりません。 また、NOT SECURED は、ビュー定義にある 1 つ以上の基礎表が行アクセス制御または列アクセス制御を使用しているビューに対して作成されたトリガーにも指定してはなりません。
BUSINESS_TIME SENSITIVE
静的および動的 SQL ステートメントでのアプリケーション期間のテンポラル表への参照が、CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターの値の影響を受けるかどうかを判別します。- はい
- アプリケーション期間のテンポラル表への参照は、CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターの値の影響を受けます。 YES はデフォルト値です。
- いいえ
- アプリケーション期間のテンポラル表への参照は、CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターの値の影響を受けません。
詳細は、CURRENT TEMPORAL BUSINESS_TIME 特別レジスタを参照してください。

SYSTEM_TIME SENSITIVE
静的および動的 SQL ステートメントの両方でのシステム期間テンポラル表への参照が、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターの値の影響を受けるかどうかを決定します。- はい
- システム期間テンポラル表への参照は、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターの値の影響を受けます。 YES はデフォルト値です。
- いいえ
- システム期間テンポラル表への参照は、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターの値の影響を受けません。
詳細は、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスタを参照してください。

ARCHIVE SENSITIVE
SQL ステートメント内のアーカイブ対応表への参照が、SYSIBMADM.GET_ARCHIVE 組み込みグローバル変数の値によって影響を受けるかどうかを決定します。- はい
- アーカイブ対応表への参照は、組み込みグローバル変数 SYSIBMADM.GET_ARCHIVE の値の影響を受けます。 YES はデフォルト値です。
- いいえ
- アーカイブ対応表への参照は、組み込みグローバル変数 SYSIBMADM.GET_ARCHIVE の値の影響を受けません。
関連情報については、 組み込みのグローバル変数 GET_ARCHIVE を参照してください。

APPLCOMPAT APPLCOMPATレベル

トリガー本体内の静的 SQL ステートメントのアプリケーション互換性レベルの動作を指定します。 デフォルト値は V12R1M500 で、トリガーには applcompat-level が V12R1M500 以上でなければならない。 詳細については、 Db2 12 の APPLCOMPAT levels を参照のこと。
詳細は、 APPLCOMPAT バインドオプションおよび APPL COMPAT LEVEL フィールド(APPLCOMPAT サブシステムパラメータ )を参照してください

CONCENTRATE STATEMENTS OFF または CONCENTRATE STATEMENTS WITH LITERALS
リテラル定数を指定する動的 SQL ステートメントの場合に、キャッシュ内の既存のステートメントを共有しないで、動的ステートメント・キャッシュ内に個別の固有ステートメント・エントリーとしてキャッシュするのかどうかを指定します。 動的 SQL ステートメントでは、キャッシュされているステートメントとは異なるリテラル定数を新規ステートメントで 1 つ以上指定している点を除いて、新規ステートメントが同じ動的ステートメントのキャッシュ・バージョンを共有する条件をすべて満たす場合に、キャッシュ内の既存のステートメントを共有できます。- CONCENTRATE STATEMENTS OFF
- リテラル定数を指定する動的 SQL ステートメントが、同じ動的ステートメントのキャッシュ済みバージョンと異なる定数を 1 つ以上指定している場合に、固有ステートメント・エントリーとしてキャッシュすることを指定します。 CONCENTRATE STATEMENTS OFF が、動的ステートメントのキャッシング動作におけるデフォルトです。
- CONCENTRATE STATEMENTS WITH LITERALS
- リテラル定数を指定する動的 SQL ステートメントは、この新規動的ステートメントが、キャッシュ済みのステートメントを使用する条件をすべて満たし、指定された定数をキャッシュ済みステートメント内の定数に代えて再利用できる場合、同じく CONCENTRATE STATEMENTS WITH LITERALS オプションを使用して準備されている、同じ動的ステートメントのキャッシュ済みバージョンを共有することを指定します。

- trigger-event
- これを指定すると、サブジェクト表またはビューにトリガー・イベントが適用されるときに、このトリガーに関連するトリガー・アクションが実行されます。
- INSERT
- トリガーが挿入トリガーであることを指定します。 Db2 対象テーブルに挿入操作があるたびに、トリガーされたアクションを実行します。 しかし、insertトリガーがexplainテーブルで定義されており、 Db2 がテーブルに行を追加したことが挿入操作の原因である場合、トリガーされたアクションは実行されません。
- DELETE
- トリガーが削除トリガーであることを指定します。 Db2 対象テーブルで削除操作が行われると、トリガーされたアクションが実行されます。
- UPDATE
- トリガーが更新トリガーであることを指定します。 Db2 対象テーブルで更新操作が行われるたびに、トリガーされたアクションが実行されます。
列名のリストを指定しないと、後で ALTER TABLE ステートメントで追加された列を含めて、 サブジェクト表の任意の列の更新操作によって、トリガー・アクションが活動化されます。
- OF 列名,..
- 指定する各 column-name は、サブジェクト表の列で、
リストに 1 回だけ現れるものでなければなりません。 任意のリスト列の
更新操作によって、トリガー・アクションが活動化されます。
UPDATE OF column-name は、INSTEAD OF トリガーには指定できません。
- triggered-action
- トリガーがアクティブ化されたときに実行するアクションを指定します。 triggered-action は、1 つ以上の SQL ステートメントと、このステートメントが
実行されるかどうかを制御するオプション条件で構成されています。
- WHEN (検索条件 )
- 真、偽、または不明と評価される条件を指定します。 トリガー SQL ステートメントは、search-condition が真と評価された場合のみ実行されます。 WHEN 文節を省略した場合、関連した SQL ステートメントは常に実行されます。
INSTEAD OF トリガーの場合は、WHEN 文節を指定してはいけません。
- SQL トリガー本体
複合ステートメントを含む単一の SQL 制御ステートメント、またはトリガーされたアクションのために実行されるトリガーされた SQL ステートメントを指定します。 SQLトリガの定義の詳細については SQL手続き言語(SQL PL) を参照してください。
SQL制御文
ネストされた制御文や、 SQL-procedure-statement (SQL PL) の構文図で指定された他の SQL 文を含むことができます。 SQL-procedure-statementに指定できる文は、トリガに関する構文の注意に従います。
- トリガー SQL ステートメント
トリガー本体で唯一のステートメントである SQL ステートメントを指定します。
.
SQL-trigger-body には、特定の SQL ステートメントのみを指定できます。
トリガー本体には、サポートされていないステートメントを含めることはできません。
- トリガー本体のステートメントは、ホスト変数、未定義の遷移変数、または宣言済み一時表を参照してはならない。
- トリガー本体のステートメントは、現行サーバーにある表またはビューだけを参照しなければならない。
トリガー本体のステートメントは、現行サーバー上のストアード・プロシージャーまたはユーザー定義の関数だけを呼び出すものでなければならない。 ただし、呼び出されたルーチンは、現行サーバー以外のサーバーにアクセス
できる。
トリガー本体のステートメントは、BUSINESS_TIME 期間の一部である列を変更してはならない。
- トリガー本体は、以下のいずれかのステートメントを含むプロシージャーに対して CALL ステートメントを直接的にも間接的にも発行してはならない。
- COMMIT
- CONNECT
- 接続を解除
RELEASE SAVEPOINT
- ROLLBACK (TO SAVEPOINT の指定なし)
SAVEPOINT
- SET CONNECTION
- トリガー本体は、COMMIT ON RETURN オプションで定義されているプロシージャーに対して CALL ステートメントを直接的にも間接的にも発行してはならない。
- トリガーが BEFORE トリガーである場合:
トリガ本体には、DELETE、INSERT、MERGE、REFRESH TABLE、TRUNCATE、UPDATE文、または、SELECT FROM data-change- 文を含んではいけません。
トリガー本体は、以下のいずれかのステートメントを含むルーチンを直接的にも間接的にも呼び出してはならない。- ALTER
- COMMENT
- CREATE
- DECLARE GLOBAL TEMPORARY TABLE
- DELETE
- DROP
- EXCHANGE
- GRANT
- INSERT
- ラベル
- LOCK TABLE
- MERGE
- REFRESH TABLE
- RENAME
- REVOKE
- TRUNCATE
- UPDATE

CREATE TRIGGER ステートメント (または ALTER TRIGGER ステートメント) には、16 進グラフィック・ストリング (GX) 定数を含めることはできません。
トリガー・アクションは、影響を受ける行のセットの中で値を参照することができます。 このアクションは、遷移変数と遷移表を用いてサポートされます。
triggered-action で参照されるすべての表、ビュー、別名、シーケンス、ロール、ユーザー定義データ・タイプ、ユーザー定義関数、およびプロシージャーは、トリガーを作成するとき、またはトリガーのバージョンを定義するときに現行サーバーに存在している必要があります。 別名が参照する表またはビューも、トリガーが作成されるとき、またはトリガーのバージョンが定義されるときに存在している必要があります。
WRAPPED 難読化ステートメント・テキスト
FL 500 トリガーのエンコードされた定義を指定します。 WRAP スカラー関数を使用して CREATE TRIGGER ステートメントを
エンコードできます。WRAPPED は、静的 CREATE ステートメントに指定してはなりません。

CREATE TRIGGER(上級者向け)に関する注意事項
- 所有者特権:
- INSTEAD OF トリガーを定義する場合、関連する特権 (ビューに対する INSERT、UPDATE、または DELETE) がそのビューの所有者に与えられます。 特権を付与される所有者は、その特権を他の人に付与することができます。 オブジェクトの所有権に関する詳細は、「権限、特権、許可、マスク、およびオブジェクトの所有権 」を参照してください。
- 実行許可:
- トリガー SQL 操作を実行するユーザーには、SQL-trigger-body を実行する権限は必要ありません。 SQL-trigger-body は、トリガーの所有者の権限を使用して実行します。
- トリガーの活動化:
- 挿入操作、削除操作、または更新操作のみが、トリガーを活動状態にできます。 トリガーの活動化では、
トリガー・カスケードが行われる場合があります。トリガー・カスケード とは、
SQL ステートメントを実行するあるトリガーを活動化すると、他のトリガー (場合によっては再び同じトリガー) が活動化されるような状態をいいます。 また、トリガー・アクションはオリジナルの変更によって更新を発生させる場合もあり、その結果として他のトリガーを活動状態にできます。 トリガー・カスケードを使用すると、大きなトリガーのチェーンが活動化される可能性があります。これにより、単一の挿入、削除、または更新操作の結果として、データベースに大きな変更が加わることがあります。 ネストされたトリガー・カスケードのレベル数は 16 レベルまでに制限されています。
LOAD ユーティリティーで表をロードしても、SHRLEVEL NONE オプションが指定されている場合や、デフォルトとして受け入れられている場合は、その表に定義されたトリガーは活動化されません。 LOAD ステートメントに SHRLEVEL CHANGE オプションが指定されている場合、LOAD ユーティリティーで表がロードされると、トリガーが活動化されます。
- トリガーの追加による制約の実施:
- 既に行を含んでいる表にトリガーを追加しても、triggered-action が実行されることはありません。 したがって、表のデータに対する制約を強化するためにトリガーを設計する場合、 既存の行のデータはその制約を満たさない可能性があります。
- 複数のトリガー:
- 活動化時点とトリガー・イベントがともに同じである複数のトリガーを 1 つの表に定義することができます。 トリガーは作成された順番に活動化されます。 例えば、最初に作成されたトリガーは最初に実行され、2 番目に作成されたトリガー
は 2 番目に実行されます。
OR REPLACEオプションが既存のトリガを置き換えるために使用された場合、作成時間が変更され、トリガの実行順序に影響を与える可能性があります。
- 遷移変数および遷移表:
- triggered-action は、影響を受けた行のセットの中で値を参照することができます。 このアクションは、遷移変数と遷移表を用いてサポートされます。
遷移変数は、トリガーが定義されている表の対応する列と同じ名前とデータ・タイプを持ち、NULL 可能です。 遷移変数には、影響を受ける行の列の値が含まれます。 遷移変数は、参照が古い値 (更新前) に対するものか、新しい値 (更新後) に対するものかを識別する相関名によって修飾されます。 遷移変数は、検索条件またはトリガー本体の SQL ステートメント内で参照できます。参照できる場所は、トリガー本体の外から発行された参照の場合に変数が許可あれるあらゆる場所です。 BEFORE UPDATE トリガーまたは INSERT トリガーで新規遷移変数に値を割り当てることができます。 更新された行の値には、BEFORE トリガーの triggered-action にある遷移変数への割り当てによる変更が加えられます。
遷移表には、古い値 (更新前) または新しい値 (更新後) のいずれかが指定されている、影響を受けた行の完全なセットが含まれます。 遷移表は読み取り専用であり、AFTER トリガーまたは INSTEAD OF トリガーの triggered-action の中で参照できます。 遷移表の列の名前、データ・タイプ、および NULL の属性は、トリガーが定義されている表の対応する列と同じです。 遷移表は、影響を受けた行の完全なセットを表として扱うことができるようにする関連表 ID を使用して参照されます。 遷移表は、検索条件またはトリガー本体の SQL ステートメント内で参照できます。参照できる場所は、トリガー本体の外から発行された参照の場合に表が許可されるあらゆる場所です。 さらにまた、遷移表の表 ID の前で TABLE キーワードを指定して、遷移表を引数としてユーザー定義の関数やプロシージャーに渡すことができます。 関数またはプロシージャーが呼び出されるときに、遷移表に対して、 表ロケーターが渡されます。
table-locator-reference エレメントに関する考慮事項:
table-locator-referenceは、トリガ本体で指定してはならない。
- 暗黙的な非表示列に関する考慮事項:
- 暗黙的な隠し列に対応する遷移変数は、トリガーの本体で参照できます。 暗黙的な非表示列がある表に対応する遷移表には、この列が遷移表の一部として格納されます。 同様に、遷移変数が、暗黙的に非表示と定義される列に対して存在します。 暗黙的な非表示列に対応する遷移変数は、トリガーの本体内で参照できます。
拡張トリガー定義内の行:
拡張トリガーの作成時、情報は CREATE ステートメント内の各行に保持されます。 行数は、改行の制御文字の存在によって決まります。拡張トリガーでは、改行制御文字 は改行に使用される特殊文字です。 拡張トリガーの改行制御文字には、以下があります。- 改行 (ライン・フィード)
- 改行 (ニュー・ライン)
- 復帰
- 復帰のあとに改行 (ライン・フィード)
- 復帰のあとに改行 (ニュー・ライン)

ID の解決:
トリガ本体内で名前が列、SQL変数、遷移変数、またはグローバル変数に解決される方法については、 SQLルーチンのSQL制御文を参照してください。列、SQL 変数、遷移変数、またはグローバル変数で非固有名が使用されている場合、列の表指定子、SQL 変数のラベル名、遷移変数の相関名、およびグローバル変数のスキーマを使用して、非固有名を修飾します。

- AFTER トリガーおよび INSTEAD OF トリガーの遷移変数に関する考慮事項:
- 遷移変数は、AFTER トリガーまたは INSTEAD トリガーの中では変更できません。
- INSTEAD OF トリガーに関する考慮事項:
- ビューに対して INSTEAD OF トリガーを追加すると、そのビューの読み取り専用特性に影響します。 読み取り専用ビューに INSTEAD OF トリガーとの従属関係がある場合は、INSTEAD OF トリガーに定義された操作タイプにより、このビューが削除可能、挿入可能、または更新可能のいずれであるかが定義されます。
INSTEAD OF トリガーを作成すると、ビュー定義が読み取り専用でない場合には、動的ステートメント・キャッシュ内の従属パッケージ、プラン、およびステートメントに「無効」のマークが付けられます。
INSTEAD OF INSERT トリガーで認識できる新規遷移変数または新規遷移表の列の初期値は、いかのように設定されます。
- 挿入操作である値がある列に明示的に指定された場合は、対応する新しい遷移変数はその明示的に指定された値です。
- 挿入操作である値がある列に明示的に指定されなかったか、または DEFAULT 節が指定された場合は、対応する新しい遷移変数は、以下のとおりです。
- ビューの列が更新可能な場合 (INSTEAD OF トリガーなしで)、基礎表の列のデフォルト値
- ビューの列が更新可能でない場合、NULL 値
ビューの列が NULL 可能でなく、デフォルトがない場合、値は挿入操作で明示的に指定する必要があります。
INSTEAD OF UPDATE トリガー内で可視の新しい遷移変数のための初期値は、以下のように設定されます。
- ある値が更新操作の中で列に対して明示的に指定される場合、対応する新規遷移変数は明示的に指定されたその値になります。
- 更新操作で DEFAULT 節がある列に明示的に指定された場合は、対応する新しい遷移変数は、以下のとおりです。
- ビューの列が更新可能な場合 (INSTEAD OF トリガーなしで)、基礎表の列のデフォルト値
- ビューの列が更新可能でない場合、NULL 値
ビューの列が NULL 可能でなく、デフォルトがない場合、値は更新操作で明示的に指定する必要があります。
- 上記以外の場合は、対応する新しい遷移変数は行内のその列の既存の値です。
- MERGE ステートメントに関する考慮事項:
MERGE 文は、挿入、削除、更新の操作を実行することができます。
該当するトリガは、実行されるデータ変更操作の MERGE ステートメントに対して起動される。- XML 列がある表に定義されたトリガーに関する考慮事項:
- XML 列を含む表に対してトリガーを定義できますが、以下の点に注意してください。
- XML 列は、トリガー本体内で遷移変数を使って参照することはできません。 SQL プロシージャー・ステートメント は、XML データ・タイプの遷移変数を参照できません。
- 遷移表の XML 列は、トリガー本体内で参照できません。 SQL-procedure-statement は、XML データ・タイプの遷移表の列を参照できません。
- SECURED オプションを使用してトリガーを作成する:
- セキュリティー管理者は通常、トリガーがアクセスするデータを調べ、データがセキュアであることを確認し、セキュアなトリガーを作成するための特権を必要とするユーザーに CREATE_SECURE_OBJECT 特権を付与します。 セキュリティー管理者は、トリガーの作成後に、トリガー所有者の CREATE_SECURE_OBJECT 特権を取り消します。
CREATE TRIGGER ステートメントの実行後に、トリガーはセキュアであると見なされます。 Db2 SECURED属性を、トリガー本体のすべてのアクティビティに対してユーザーが監査手順を確立したことを宣言するアサーションとして扱います。 安全なトリガーがユーザー定義関数を参照する場合、 Db2 は検証なしでそれらの関数が安全であると仮定します。 この関数が機密データにアクセスできる場合、SECADM 権限を持つユーザーは、この関数が機密データにアクセスすることを許可されること、監査プロシージャーがこの関数のすべてのバージョンに適していること、および後続のすべての ALTER FUNCTION ステートメント、または外部パッケージに対する変更内容がこの監査プロセスで確認されることを確実にする必要があります。
トリガーのサブジェクト表が行アクセス制御または列アクセス制御を使用している場合、そのトリガーはセキュアである必要があります。 ビュー定義の 1 つ以上の基礎表で行アクセス制御または列アクセス制御が使用される場合、ビューに対して作成されるトリガーにも SECURED を指定する必要があります。
- NOT SECURED オプションを使用してトリガーを作成する:
- CREATE TRIGGER ステートメントからエラーが戻されるのは、トリガーのサブジェクト表で行アクセス制御または列アクセス制御が使用されている場合、またはこのトリガーがビューのトリガーであり、ビュー定義の 1 つ以上の基礎表で行アクセス制御または列アクセス制御が使用されている場合です。
- 遷移変数と遷移表に適用されない行アクセス制御と列アクセス制御:
- トリガーのサブジェクト表に行アクセス制御か列アクセス制御が実施される場合、許可および列マスクは、遷移変数および遷移表の初期値には適用されません。 行アクセス制御および列アクセス制御はトリガー表では実施されますが、トリガー本体で参照されるかまたはトリガー本体で呼び出されるユーザー定義関数に引数として渡される遷移変数および遷移表では無視されます。 SQL ステートメントがトリガー・アクションで遷移変数または遷移表の機密データにアクセスすることに関してセキュリティー上の問題がないようにするため、SECURED オプションを使用してトリガーを作成してください。 トリガーがセキュアでない場合、CREATE TRIGGER ステートメントを実行するとエラーが返されます。
トリガーのバージョン:
CREATE TRIGGER ステートメントは、トリガーの初期バージョンを定義します。 トリガーの 1 つのバージョンだけを、アクティブなトリガー・バージョンであると見なすことができます。 ALTER TRIGGER ステートメントの ADD VERSION 文節を使用して、またはトリガーが既に存在している場合は OR REPLACE 文節と VERSION 文節を指定した CREATE TRIGGER ステートメントを使用して、追加バージョンを定義できます。
ALTER PROCEDURE文のREPLACE VERSION句、またはCREATE PROCEDURE文のOR REPLACE句とVERSION句を使用すると、プロシージャのバージョンが既に存在する場合に、バージョンを置き換えることができます。
トリガの全てのバージョンで、以下のトリガ属性は同じでなければなりません: trigger-activation-time、trigger-event、table or view name、 trigger-granularity。 REFERENCING 文節の内容は、トリガーの各バージョンで異なっていても構いません。
- 保留定義変更に関する制約事項は、以下のとおりです。
- 保留している定義変更がある表でトリガーが定義されている場合、CREATE TRIGGER は許可されません。
- EXPLAIN のための特殊プラン、ステートメント、および関数表に関する考慮事項:
- PLAN_TABLE、 DSN_STATEMNT_TABLE、または DSN_FUNCTION_TABLE に関するトリガーを作成できます。 しかし、これらのテーブルで定義された挿入トリガーは、 Db2 がテーブルに行を追加する際に起動されません。
従属オブジェクト:
トリガーは、トリガー本体で参照されているトリガー表またはビューとオブジェクトに従属します。
- サブジェクト表または triggered-action で参照される表への列の追加:
- トリガーの定義後にサブジェクト表に列が追加された場合、次の規則が適用されます。
- 列名の明示リストなしで定義されている更新トリガーの場合、新しい列への 更新によってトリガーが起動されます。
- triggered-action でサブジェクト表を参照する場合、トリガー・パッケージが再バインドされないうちは SQL ステートメントから新しい列にアクセスできません。
- OLD_TABLE 遷移表と NEW_TABLE 遷移表は新しい列を含んでいますが、トリガーを再作成しない限りこの列は参照できません。 遷移表がユーザー定義関数またはストアード・プロシージャーに 渡される場合は、そのユーザー定義関数またはストアード・プロシージャーを、表の新しい定義で再作成 して (つまり、関数またはプロシージャーをドロップして、再作成する必要がある)、ユーザー定義関数またはストアード・プロシージャーのパッケージを再バインドする必要があります。
triggered-action で参照される任意の表に列を追加する場合、トリガー・パッケージが再バインドされないうちは SQL ステートメントからその新しい列にアクセスできません。
- トリガー・アクションが参照する列の属性の変更:
- トリガーが定義されている対象の表 (サブジェクト表) の中で列が変更された場合、変更は処理され、従属するトリガー・パッケージは無効になります。
- トリガーの定義先の表または triggered-action で参照される表の名前変更:
- トリガーの定義先の表 (サブジェクト表) を名前変更することはできません。 サブジェクト表の場合を除いて、 トリガー・アクションの SQL ステートメントが参照する表の名前は変更できます。 このような表の名前を変更した後は、トリガーをドロップしてから、名前を変更された 表を参照するようにトリガーを再作成してください。
トリガーの定義先の表またはビューのドロップ:
トリガーの定義先の表またはビューがドロップされると、トリガーもドロップされます。
- triggered-action で参照されているオブジェクトに対する特権のドロップまたは取り消しの影響:
- トリガー本体で参照されているオブジェクトをドロップするか、トリガー本体で参照されているオブジェクトに対する特権を取り消すと、以下の結果が生じる可能性があります。
- トリガー・アクションの SQL ステートメントの内部で参照または使用される 任意の表、ビュー、別名、または索引をドロップすると、トリガーとそのパッケージが無効に なります。
- 参照されているシノニムをドロップしても、トリガーまたはパッケージに影響はありません。
- トリガー・アクションの SQL ステートメントによって参照されるユーザー定義関数をドロップすることは許されません。 エラーが発生します。
- トリガー・アクションの SQL ステートメントによって参照されるシーケンスをドロップすることは許されません。 エラーが発生します。
- トリガーが依存する特権を取り消すと、トリガーとそのパッケージが 無効になります。 トリガー・パッケージが再バインドされるときに、適切な特権が存在していない場合、オブジェクトを参照する SQL ステートメントは失敗します。
- トリガーでのエラー処理:
- トリガーは、その他の SQL ステートメントと同様にエラーを返すことがあります。 アプリケーションは、トリガーを呼び出す際に予想できるエラーを認識している必要があります。
トリガ本体内で(ハンドラを使用して)処理されない例外SQLSTATEは、トリガを起動させたステートメントに例外SQLSTATEを返します。 :例えば、SIGNAL ステートメント (RESIGNAL ステートメントまたは RAISE_ERROR 関数) が SQL-trigger-body で重大でないエラーを出して、その状態がトリガー本体内で処理されない場合、SQLCODE -438 および対応する SQLSTATE が返されます。 他の重大でないエラーは、SQLCODE -723 お
よび SQLSTATE 09000 を付けて戻されます。 トリガー SQL ステートメントの実行時に発生する重大エラーは、SQLCODE -901、-906、-911、または -913 と対応する SQLSTATE を付けて戻されます。 警告は返されない。
- トリガーおよびグローバル変数:
- トリガーによって参照されるグローバル変数の内容は、トリガー SQL 操作 (削除、挿入、更新) から継承されます。
- 特殊レジスター:
- トリガー本体で使用される特殊レジスターの値は、トリガーが活動化されるときに決定されます。 CURRENT PACKAGESET 特殊レジスターの値はトリガーのスキーマ名に設定され、その他の特殊レジスターの値は、トリガー SQL 操作 (挿入、更新、削除) から継承されます。 特殊レジスターの値は、トリガーが活動化されるときに保存され、トリガーから戻る際にリストアされます。 CURRENT DATE、CURRENT TIME、および CURRENT TIMESTAMP の特殊レジスターは、トリガーから戻るときにリストアされません。
- ストアード・プロシージャーの結果セット:
- トリガーが結果セットを戻すストアード・プロシージャーを呼び出す場合、そのトリガーを活動化したアプリケーションはその結果セットにアクセスできません。
- トランザクションの分離:
- SQL-trigger-body にあるすべてのステートメントは、そのトリガーで有効になっている分離レベルで実行されます。
- プロセッサー時間の制限:
Db2 リソース制限機能を使用すると、SELECT や SQL データ変更文のような動的で操作性の高い SQL 文の最大プロセッサ時間を指定できます。 トリガーの実行はトリガーとなる SQL ステートメントの一部としてカウントされます。 ASUTIME トリガー・オプションを使用すると、そのような制限を指定できます。
- トリガーのバインド時のエラー:
- CREATE TRIGGER ステートメントをバインドするとき、トリガー・アクション内の SQL ステートメントは完全に解析されない場合があります。 それらのステートメントの構文エラー が、CREATE TRIGGER ステートメントが実行されるまで捕らえられない場合があるからです。
- トリガー用に生成されるパッケージの特性:
- 最トリガーに関連するパッケージは、以下のようにして名前を指定します。
- location は、CURRENT SERVER 特殊レジスターの値に設定されます。
- パッケージ用の collection-id (スキーマ) は、トリガーのスキーマ修飾子と同じです。
- package-id は、トリガーの名前と同じです。
パッケージは、暗黙的または明示的に指定されたトリガー・オプションに対応するバインド・オプションを使用して生成されます。 詳細は表2 を参照してください。 対応するバインド・オプション以外に、パッケージは以下のバインド・オプションを使用して生成されます。

- FLAG(I)
- SQLERROR(NOPACKAGE)
- イネーブル(*)
- VALIDATE(BIND)

オブジェクトまたはオブジェクトが依存する特権がドロップされるか取り消されると、 トリガー・パッケージは無効になります。 次にトリガーが起動された際に、 Db2 は無効なトリガーパッケージの再割り当てを試みます。 自動再バインドが 不成功に終わると、トリガー・パッケージは無効のままになります。
BIND COPY コマンドを使用する場合のように、トリガー・パッケージから別の
パッケージを作成することはできません。 トリガー・パッケージをドロップする唯一の方法は、トリガー、あるいはサブジェクト表またはビューのドロップです。 トリガーをドロップするとトリガー・パッケージがドロップされ、サブジェクト表またはビューをドロップするとトリガーとトリガー・パッケージがドロップされます。
トリガーが活動化するたびに、トリガー・パッケージは 1 回以上実行されます。
- SQL プロセッサー・プログラムに関する考慮事項:
- SPUFI、 Db2 command line processor、 DSNTEP2 などのSQLプロセッサプログラムは、セミコロンで終わるトリガーアクションのSQLステートメントを正しく解析できない場合があります。 これらのプロセッサー・プログラムは、複数の SQL ステートメント (間を終了文字で 分離されている) を入力として受け入れます。 セミコロンをSQL文の終端文字として使用するプロセッサプログラムは、セミコロンが埋め込まれたCREATE TRIGGER文を切り捨て、その一部のみを Db2 に渡す可能性があります。 そのため、これらのプロセッサー・プログラムの場合は、SQL 終了文字の変更が必要に なる可能性があります。 SPUFI および DSNTEP2 の終了文字を変更する方法については、 SPUFI 入力データ セットでの SQL 終了文字の設定および DSNTEP2 および DSNTEP4 サンプル プログラムを参照してください。
- トリガー・オブジェクトのアプリケーション互換性レベルに関する考慮事項
- アプリケーション互換性レベルは、新機能および機能拡張の採用と使用を制御します。 オブジェクトが作成または変更されると、2 つの別個のアプリケーション互換性レベルが使用されます。1 つはオブジェクトの定義を処理するために使用され、もう 1 つはオブジェクト本体内の SQL ステートメントを処理するために使用されます。
オブジェクト定義 CURRENT APPLICATION COMPATIBILITY 特殊レジスター値は、オブジェクト本体内のステートメントを除き、オブジェクト定義を処理するために使用されます
このアプリケーション互換性レベルは、SYSENVIRONMENT.APPLCOMPAT 列に保管されます。 オブジェクトのカタログ定義内の環境 ID 値を使用して、ENVID 値が一致する SYSENVIRONMENT 行を見つけることができます。
このアプリケーション互換性レベルは、オブジェクトの再生成時に変更できます。
オブジェクト本体内のステートメント CREATE または ALTER ステートメントの APPLCOMPAT オプションで暗黙的または明示的に指定されたアプリケーション互換性レベルは、オブジェクト本体のステートメントを処理するために使用されます。
このアプリケーション互換性レベルは、オブジェクト定義に関連付けられたパッケージの SYSPACKAGE.APPLCOMPAT 列に保管されます。
- 代替構文およびシノニム:
- Db2ファミリー内のDb2または他の製品の以前のリリースとの互換性を提供するために、Db2は以下のキーワードをサポートします。
- OLD_TABLE のシノニムとして OLD TABLE
- NEW_TABLE のシノニムとして NEW TABLE
難読化されたステートメント:
FL 500A CREATE TRIGGER 文は難読化された形式で実行できます。 難読化されたステートメントでは、トリガー名および WRAPPED キーワードのみを判読できます。 ステートメントのその他の部分は、読み取り不能な、しかも難読化ステートメントをサポートするデータベース・サーバーでデコード可能な方法でエンコードされます。 WRAP スカラー関数は、難読化されたステートメントを作成します。 難読化されたステートメントからトリガーが
作成されるときに指定されるデバッグ・オプションはすべて無視されます。
CREATE TRIGGER の例(上級者向け)
- 例 1
- 会社が管理する従業員の数を追跡する 2 つのトリガーを作成します。 サブジェクト表は EMPLOYEE 表で、COMPANY_STATS 表の従業員の
総数の列の増分と減分を起動します。 表には次の列があります。
- EMPLOYEE 表: ID、NAME、ADDRESS、および POSITION
- COMPANY_STATS 表: NBEMP、NBPRODUCT、および REVENUE
この例は、行トリガーで遷移変数を使用して、別の表の合計データを保守する方法を 示しています。
最初のトリガー NEW_HIRE を作成して、このトリガーが新しく人を雇うたびに従業員数を 増分するようにします。すなわち、EMPLOYEE 表に新しい行が挿入されるたびに、COMPANY_STATS 表 の NBEMP 列の値を 1 だけ増やします。
CREATE TRIGGER NEW_HIRE AFTER INSERT ON EMPLOYEE FOR EACH ROW BEGIN ATOMIC UPDATE COMPANY_STATS SET NBEMP = NBEMP + 1; END
2 番目のトリガー FORM_EMP を作成して、このトリガーが従業員が会社を離れるたびに従業員数を 減分するようにします。すなわち、EMPLOYEE 表から行が削除されるたびに、COMPANY_STATS 表 の NBEMP 列の値を 1 だけ減らします。
CREATE TRIGGER FORM_EMP AFTER DELETE ON EMPLOYEE FOR EACH ROW BEGIN ATOMIC UPDATE COMPANY_STATS SET NBEMP = NBEMP - 1; END
- 例 2
トリガー REORDER を作成し、ユーザー定義関数 ISSUE_SHIP_REQUEST を呼び出して、部品レコードが更新され、影響を受ける部品の手持ち数量が最大在庫数量の 10% 未満になるたびに出荷要求を発行します。 ユーザー定義関数 ISSUE_SHIP_REQUEST は、部品の最大在庫数量から手持ち数量を引いた数量の部品を注文します。また、この関数は、要求が適切な製造業者に確実に送信されるようにして、注文した数量を戻します。
パーツ・レコードは PARTS 表にあります。 この表には他にも列がありますが、 トリガーが起動されるのは、列 ON_HAND と MAX_STOCKED が更新されたときだけです。
CREATE TRIGGER REORDER AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS REFERENCING NEW AS NROW FOR EACH ROW WHEN (NROW.ON_HAND < 0.10 * NROW.MAX_STOCKED) BEGIN ATOMIC DECLARE QTY_ORDERED INTEGER; VALUES(ISSUE_SHIP_REQUEST(NROW.MAX_STOCKED - NROW.ON_HAND, NROW.PARTNO)) INTO QTY_ORDERED; END- 例 3
- VALUES INTO ステートメントの代わりに SELECT INTO ステートメントを使用してユーザー定義関数を呼び出すことを除いて、例 2 のシナリオを繰り返します。 この例では、行トリガーの代わりにステートメント・トリガーとしてトリガーを定義する方法も示します。 WHERE 節について真と評価する遷移表の行ごとに、部品の出荷要求を発行します。

CREATE TRIGGER REORDER AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS REFERENCING NEW_TABLE AS NTABLE FOR EACH STATEMENT BEGIN ATOMIC DECLARE QTY_ORDERED INTEGER; SELECT ISSUE_SHIP_REQUEST(MAX_STOCKED - ON_HAND, PARTNO) FROM NTABLE WHERE (ON_HAND < 0.10 * MAX_STOCKED) INTO QTY_ORDERED; END
- 例 4
- 表 EMPLOYEE に列 SALARY が含まれているとします。 20% を超える従業員の給与の更新を防止し、このようなエラーの信号を出す
トリガー、SAL_ADJ を作成します。 エラーとともに、SQLSTATE「75001」と記述を戻します。 この例は、SIGNAL ステートメントが
ビジネス規則に違反するような変更を制限するために便利であることを示しています。

CREATE TRIGGER SAL_ADJ AFTER UPDATE OF SALARY ON EMPLOYEE REFERENCING OLD AS OLD_EMP NEW AS NEW_EMP FOR EACH ROW WHEN (NEW_EMP.SALARY > (OLD_EMP.SALARY * 1.20)) BEGIN ATOMIC SIGNAL SQLSTATE '75001' ('Invalid Salary Increase - Exceeds 20 END
- 例 5
- 以下のステートメントにより、表 WEATHER (温度値を華氏で保管する) とビュー CELSIUS_WEATHER が作成され、華氏ではなく摂氏で作業することを希望するユーザーに対して作成されるとします。
以下の INSTEAD OF トリガーを CELSIUS_WEATHER ビューで使用して、摂氏の値を華氏の値に変換し、さらに、華氏の値を WEATHER 表に挿入します。CREATE TABLE WEATHER (CITY VARCHAR(25), TEMPF DECIMAL(5,2)); CREATE VIEW CELSIUS_WEATHER (CITY, TEMPC) AS SELECT CITY, (TEMPF-32)/1.8 FROM WEATHER;
CREATE TRIGGER CW_INSERT INSTEAD OF INSERT ON CELSIUS_WEATHER REFERENCING NEW AS NEWCW FOR EACH ROW BEGIN ATOMIC INSERT INTO WEATHER VALUES (NEWCW.CITY, 1.8*NEWCW.TEMPC+32) END;
- 例 6
- 株価の変更を記録して追跡するロジックを使用して、更新前トリガー STOCK_STATUS を作成します。
データベースに CURRENTQUOTE と QUOTEHISTORY という 2 つの表が含まれていることを想定しています。 CURRENTQUOTE には、列 SYMBOL、QUOTE、および STATUS があります。 QUOTEHISTORY には、列 SYMBOL、QUOTE、および QUOTE_TIMESTAMP があります。
CURRENTQUOTE の QUOTE 列が更新されると、新規見積価格はタイム・スタンプと一緒に QUOTEHISTORY 表にコピーされる必要があります。 また、CURRENTQUOTE の STATUS 列も、次のようなカブの状況が反映されるように更新します。

1 値上がり中 2 新しい年内最高額 3 値下がり中 4 新しい年内最低額 5 安定価格 
これらのタスクを実行する CREATE TRIGGER ステートメントは次のとおりです。
トリガー STOCK_STATUS は以下の状況を設定します。

CREATE TRIGGER STOCK_STATUS NO CASCADE BEFORE UPDATE OF QUOTE ON CURRENTQUOTE REFERENCING NEW AS NEWQUOTE OLD AS OLDQUOTE FOR EACH ROW BEGIN ATOMIC SET NEWQUOTE.STATUS = CASE WHEN NEWQUOTE.QUOTE > (SELECT MAX(QUOTE) FROM QUOTEHISTORY WHERE SYMBOL = NEWQUOTE.SYMBOL AND YEAR(QUOTE_TIMESTAMP) = YEAR(CURRENT DATE) ) THEN 'High' WHEN NEWQUOTE.QUOTE < (SELECT MIN(QUOTE) FROM QUOTEHISTORY WHERE SYMBOL = NEWQUOTE.SYMBOL AND YEAR(QUOTE_TIMESTAMP) = YEAR(CURRENT DATE) ) THEN 'Low' WHEN NEWQUOTE.QUOTE > OLDQUOTE.QUOTE THEN 'Rising' WHEN NEWQUOTE.QUOTE < OLDQUOTE.QUOTE THEN 'Dropping' WHEN NEWQUOTE.QUOTE = OLDQUOTE.QUOTE THEN 'Steady' END; END
トリガー RECORD_HISTORY は、QUOTEHISTORY 表の変化を記録します。
CREATE TRIGGER RECORD_HISTORY AFTER UPDATE OF QUOTE ON CURRENTQUOTE REFERENCING NEW AS NEWQUOTE FOR EACH ROW BEGIN ATOMIC INSERT INTO QUOTEHISTORY VALUES (NEWQUOTE.SYMBOL, NEWQUOTE.QUOTE, CURRENT TIMESTAMP); END - 例 7
- 挿入前トリガー NEW_HIRED を作成します。これは、トリガー本体内で宣言された SQL 変数と比較して、遷移変数のさまざまなスコープを示すためにロジックを使用します。 EMPLOYEE 表が次のように定義されているとします。
CREATE TABLE EMPLOYEE (EMPNO CHAR(6), FIRSTNAME VARCHAR(32), WORKDEPT CHAR(5), NUM INTEGER)#トリガー NEW_HIRED では、新しい値の遷移変数の相関名は XYZ であり、XYZ は SQL 変数が定義されているコンパウンド・ステートメントのラベルでもあります。 表には NUM という列があり、SQL 変数の名前も NUM です。 割り当てステートメント内の XYZ.NUM への参照は、SQL 変数を参照します。これは、最もローカルにスコープされた割り当てステートメントの定義であるためです。
CREATE TRIGGER NEW_HIRED BEFORE INSERT ON EMPLOYEE REFERENCING NEW AS XYZ FOR EACH ROW XYZ: BEGIN DECLARE NUM INTEGER; SET XYZ.NUM = XYZ.NUM + 1; END XYZ#次の INSERT ステートメントを実行するとします。
INSERT INTO EMPLOYEE VALUES ('000001', 'RICK', 'DPT01', 10)#表の中の値は、INSERT ステートメントの VALUES 節で最初に指定された値と同じです。 つまり、NUM 遷移変数は割り当てステートメントの影響を受けません。 代入ステートメント内の XYZ.NUM への参照は、遷移変数 NUM ではなく、SQL 変数 NUM に解決されます。
次の SELECT ステートメントを発行して、INSERT ステートメントの実行後の結果を確認します。
SELECT * FROM EMPLOYEE#結果は次のようになります。

EMPNO FIRSTNAME WORKDEPT NUM 000001 RICK DPT01 10 
- 例 8
- CLASS_SCHED への INSERT で終了時刻が指定されていない場合に、クラスが開始から 1 時間後に終了するという規則を適用するロジックを使用して、BEFORE INSERT トリガーを作成します。 クラスの終了が 9 PM より後になってはいけないという追加の制限を実施するトリガーを定義します。

CREATE TRIGGER VALIDATE_SCHED BEFORE INSERT ON CLASS_SCHED REFERENCING NEW AS N FOR EACH ROW WHEN (N.ENDING IS NULL OR N.ENDING > '21:00') VS: BEGIN -- SUPPLY DEFAULT VALUE FOR ENDING TIME IF NULL IF (N.ENDING IS NULL) THEN SET N.ENDING = N.STARTING + 1 HOUR; END IF; -- ENSURE THAT CLASS DOES NOT END BEYOND 9PM IF (N.ENDING > '21:00') THEN SIGNAL SQLSTATE '80000' SET MESSAGE_TEXT = 'CLASS ENDING TIME IS BEYOND 9 PM'; END IF; END VS
例 9: トリガー VALIDATE_SCHED を変更して、授業が午後 7 時を超えて終了しないように制限を変更します。 OR REPLACE 節がオリジナルの CREATE TRIGGER ステートメントに追加され、終了時刻をチェックするように規則が変更されます (N.ENDING > '19:00')。 CREATE TRIGGER ステートメントは、トリガーの既存の定義を更新後の定義に置換します。

CREATE OR REPLACE TRIGGER VALIDATE_SCHED BEFORE INSERT ON CLASSES REFERENCING NEW AS N FOR EACH ROW -- TRIGGER WHEN CLAUSE WHEN (N.ENDING IS NULL OR N.ENDING > '19:00') VS: BEGIN -- SUPPLY DEFAULT VALUE FOR ENDING TIME IF NULL IF (N.ENDING IS NULL) THEN SET N.ENDING = N.STARTING + 1 HOUR; END IF; -- ENSURE THAT CLASS DOES NOT END BEYOND 7 PM IF (N.ENDING > '19:00') THEN SIGNAL SQLSTATE '80000' SET MESSAGE_TEXT = 'CLASS ENDING TIME IS BEYOND 7 PM'; END IF; END VS

