- 認可識別子
- 定義するトリガの所有者の認可識別子を指定します。省略した場合,CREATE TRIGGERを実行するユーザの認可識別子が仮定されます。
- トリガ識別子
- 定義するトリガの名前を指定します。
- BEFORE
- 表に対する操作の前に,トリガ動作を実行します。
- BEFOREを指定した場合,データを更新するSQL(INSERT文,UPDATE文,及びDELETE文),CALL文,及びデフォルトコンストラクタ関数以外の関数呼出しは,トリガSQL文中には指定できません。
- トリガ動作時期にBEFOREを指定したトリガを,BEFOREトリガといいます。
- AFTER
- 表に対する操作の後に,トリガ動作を実行します。
- トリガ動作時期にAFTERを指定したトリガを,AFTERトリガといいます。
- トリガ契機::={INSERT|DELETE|UPDATE〔OF 列名〔,列名〕…〕}
どのような操作をしたときにトリガを実行するかを指定します。
- INSERT
- 表に行を挿入したときにトリガを実行します。トリガ契機にINSERTを指定したトリガをINSERTトリガといいます。
- トリガ契機にINSERTを指定した場合,新旧値別名にOLD〔ROW〕〔AS〕旧値相関名は指定できません。
- DELETE
- 表の行を削除したときにトリガを実行します。トリガ契機にDELETEを指定したトリガをDELETEトリガといいます。
- トリガ契機にDELETEを指定した場合,新旧値別名にNEW〔ROW〕〔AS〕新値相関名は指定できません。
- UPDATE
- 表の行を更新したときにトリガを実行します。トリガ契機にUPDATEを指定したトリガをUPDATEトリガといいます。
- トリガ契機にUPDATEを指定した場合,トリガ動作条件を満たしていれば,更新前後で値が同じでもトリガを実行します。
- OF 列名〔,列名〕…
- 特定の列を更新したときにトリガを実行したい場合,OF 列名〔,列名〕…を指定します。ここで指定した列を,トリガ契機列といいます。
- トリガ契機列についての規則を次に示します。
- 列名には,トリガを定義する表の列名を指定します。
- 列名は重複して指定できません。
- 繰返し列を指定した場合,その列に対するADD句,又はDELETE句だけのUPDATE文でも,トリガを実行します。
- トリガ契機列を省略した場合,対象表のすべての列名が仮定されます(トリガ定義後に追加した列も含まれます)。また,ADD句,又はDELETE句だけのUPDATE文でも,トリガを実行します。
トリガを定義する実表の表名を指定します。
トリガは,自分の表にだけ定義できます。ビュー表,外部表,及び他RDノードの表に対してトリガは定義できません。
- REFERENCING 新旧値別名リスト::=新旧値別名〔新旧値別名〕
トリガ定義中で更新前後の行を参照する場合に,別名を指定します。
新旧値別名には,OLD〔ROW〕〔AS〕旧値相関名,又はNEW〔ROW〕〔AS〕新値相関名を,それぞれ1回だけ指定できます。
- 新旧値別名::={OLD 〔ROW〕 〔AS〕 旧値相関名|NEW 〔ROW〕 〔AS〕 新値相関名}
旧値相関名::=相関名
新値相関名::=相関名
更新前,又は更新後の行に名前を付けて参照する場合に指定します。
新旧値別名についての規則を次に示します。
- ROW及びASは,指定してもしなくても同じです。
- 旧値相関名と新値相関名には,同じ相関名は指定できません。
- 旧値相関名,又は新値相関名に指定した相関名の有効範囲は,トリガ定義全体になります。
- BEFOREトリガで新値相関名で修飾した列を更新した場合は,その更新内容が表に反映されます。ただし,BEFOREトリガでは,次の列を新値相関名で修飾した更新はできません。更新した場合は実行時エラーとなります。
また,トリガ契機がINSERTのBEFOREトリガでは,次の列を新値相関名で修飾した更新はできません。更新した場合は実行時エラーとなります。
- 分割表(フレキシブルハッシュ分割表を除く)の分割キーに指定した列
BEFOREトリガの場合,新値相関名で修飾して更新するときでも,更新する前の挿入値(トリガ契機がINSERTの場合),又は更新値(トリガ契機がUPDATEの場合)は,指定した列に挿入又は更新できる値でなければなりません。例えば,非ナル値制約ありの列には,トリガ動作で更新する前の挿入値又は更新値としてNULLは指定できません。ただし,一意性制約については,トリガ動作で更新した後の値が一意性制約を満たしていれば挿入又は更新ができます。
- 繰返し列及び抽象データ型列は,新値相関名,及び旧値相関名で修飾して参照できません(トリガ定義中で,トリガを定義する表中の繰返し列及び抽象データ型列は参照できません)。
- 旧値相関名,及び新値相関名には,ROWは指定できません。
- OLD 〔ROW〕 〔AS〕 旧値相関名
- 更新前の行に名前を付けて参照する場合に指定します。
- 旧値相関名で修飾した列が保持する値は,トリガの契機となるSQLの実行前の値です。UPDATE文の場合は更新前の値,DELETE文の場合は削除する行の列値となります。
- NEW 〔ROW〕 〔AS〕 新値相関名
- 更新後の行に名前を付けて参照する場合に指定します。
- 新値相関名で修飾した列が保持する値は,トリガの契機となるSQLの実行結果の値です。UPDATE文の場合は更新後の値,INSERT文の場合は挿入値となります。ただし,トリガ中で新値相関名で修飾した列を更新した場合は,更新した値を引き継ぎます。
- トリガ動作::=
〔{FOR EACH ROW|FOR EACH STATEMENT}〕
〔WHEN (探索条件)〕
トリガSQL文
- FOR EACH ROW
- トリガを,更新した行単位に実行する場合に指定します。トリガ動作にFOR EACH ROWを指定したトリガを,行単位トリガといいます。
- FOR EACH ROWを指定した場合,表を1行更新するごとにトリガを実行します。
- FOR EACH STATEMENT
- トリガを,SQL文単位に実行する場合に指定します。トリガ動作にFOR EACH STATEMENTを指定したトリガを,文単位トリガといいます。
- FOR EACH STATEMENTを指定した場合,一つのSQL文ごとにトリガを実行します。更新対象の行がない場合でもトリガを実行します。
- FOR EACH STATEMENTを指定した場合,新旧値別名リストは指定できません。
- 探索条件
- トリガ契機が発生したとき,ここに指定した条件が真になる場合にトリガSQL文を実行します。この探索条件を,トリガ動作条件といいます。
- トリガ動作条件を省略した場合,指定したトリガ契機が発生すると必ずトリガSQL文を実行します。トリガ動作条件には,次のものは指定できません。
- 副問合せ
- 集合関数又はSQL/XML集合関数
- ウィンドウ関数
- 繰返し列
- 埋込み変数,?パラメタ,SQL変数,及びSQLパラメタ
- 次のデータ型の列
・BLOB(ただし,スカラ関数LENGTH,スカラ関数POSITION,及びユーザ定義関数の関数呼出しの中では指定できます)
・最大長32,001バイト以上のBINARY(ただし,スカラ関数LENGTH,スカラ関数POSITION,及びユーザ定義関数の関数呼出しの中では指定できます)
・抽象データ型
- 構造化繰返し述語
- プラグイン関数
- 結果が抽象データ型となる値式(値式中にも指定できません)
- トリガ動作条件中でトリガを定義する表の列を参照する場合は,新旧値相関名で修飾してください(修飾なし,又は表名での修飾は指定できません)。
- XMLコンストラクタ関数
- SQL/XMLスカラ関数
- トリガSQL文
- SQL手続き文を指定します。SQL手続き文については,「7. ルーチン制御SQL」を参照してください。
- トリガSQL文として指定するSQL手続き文には,次の制限があります。
- トリガを定義している表の表名は指定できません。
- トリガを定義している表の列を,修飾なし,又は表名で修飾して指定することはできません(新旧値別名で修飾した列は指定できます)。列を新旧値相関名で修飾した場合,トリガSQL文中でこの列指定を指定できる箇所は,SQL文中でSQLパラメタを指定できる箇所と同じになります。SQLパラメタを指定できる箇所については,「1.6 埋込み変数,標識変数,?パラメタ,SQLパラメタ,及びSQL変数」を参照してください。ただし,LIMIT句にはこの列指定は指定できません。
- 外部表の表名は指定できません。
- ROLLBACK文,COMMIT文,及びPURGE TABLE文は指定できません。また,CALL文でこれらを指定した手続きが呼び出された場合は,実行時エラーとなります。
- JAVAストアドプロシジャ,及びGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。また,CALL文でJAVAストアドプロシジャを指定した手続きが呼び出された場合は,実行時エラーとなります。
- トリガSQL文中で,新値相関名,又は旧値相関名で修飾して指定する列の個数は30,000以下にしてください。
- SQLコンパイルオプション::={ISOLATION データ保証レベル 〔FOR UPDATE EXCLUSIVE〕
|OPTIMIZE LEVEL SQL最適化オプション
〔,SQL最適化オプション〕…
|ADD OPTIMIZE LEVEL SQL拡張最適化オプション
〔,SQL拡張最適化オプション〕…
|SUBSTR LENGTH 文字の最大長 }
SQLコンパイルオプションには ISOLATION,OPTIMIZE LEVEL,ADD OPTIMIZE LEVEL,SUBSTR LENGTHをそれぞれ1回しか指定できません。
- 〔ISOLATION データ保証レベル 〔FOR UPDATE EXCLUSIVE〕〕
- SQLのデータ保証レベルを指定します。
- データ保証レベル
- データ保証レベルとは,トランザクションのどの時点までデータの内容を保証するかのレベルをいいます。次に示すデータ保証レベルを指定できます。
- 0
データの内容を保証しない場合に指定します。0レベルを指定すると,ほかのユーザが更新中のデータでも,更新完了を待たないで参照できます。ただし,参照する表が共用表の場合,ほかのユーザが排他モードでLOCK文を実行しているときには,排他解除待ちとなります。
- 1
検索処理の終了までデータの内容を保証したい場合に指定します。1レベルを指定すると,検索処理が終了するまで(HiRDBがページ,又は行を見終わるまで)1度検索したデータをほかのユーザは更新できません。
- 2
トランザクションの終了まで1度検索したデータの内容を保証したい場合に指定します。2レベルを指定すると,トランザクションが終了するまで1度検索したデータをほかのユーザは更新できません。
- 〔FOR UPDATE EXCLUSIVE〕
- 手続き中のFOR UPDATE句を指定した,又は仮定されるカーソル,及び問合せに対してSQLコンパイルオプションで指定したデータ保証レベルに関係なく常にWITH EXCLUSIVE LOCKを仮定する場合に指定します。データ保証レベルに2レベルを指定した場合,FOR UPDATE句を指定した,又は仮定されるカーソル,及び問合せにはWITH EXCLUSIVE LOCKを仮定するため,FOR UPDATE EXCLUSIVEを指定する必要はありません。
- 《クライアント環境定義との関係》
- CREATE TRIGGERに対して,PDISLLVL,PDFORUPDATEEXLOCKの指定は無効となります。
- 《SQLとの関係》
- 手続き中のSQL文に排他オプションを指定している場合はSQLコンパイルオプションで指定するデータ保証レベル,及びFOR UPDATE EXCLUSIVEから仮定する排他オプションよりSQL文に指定した排他オプションが優先されます。
- このオペランドを省略した場合,データ保証レベルに2レベルが仮定されます。
- データ保証レベルについては,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
- 〔OPTIMIZE LEVEL SQL最適化オプション〔,SQL最適化オプション〕…〕
- データベースの状態を考慮して,最も効率的なアクセスパスを決定するための最適化の方法を指定します。
- SQL最適化オプションは,識別子(文字列)で指定する方法と,数値で指定する方法がありますが,通常時は識別子で指定する方法をお勧めします。
-
- 識別子で指定する場合:
OPTIMIZE LEVEL "識別子"〔,"識別子"〕…
- <指定例>
- ネストループジョイン優先とグループ分け高速化処理を適用する場合
OPTIMIZE LEVEL "PRIOR_NEST_JOIN","RAPID_GROUPING"
- すべての最適化を適用しない場合
OPTIMIZE LEVEL "NONE"
- <規則>
- 識別子は一つ以上指定してください。
- 識別子を二つ以上指定する場合は,コンマ(,)で区切ってください。
- 識別子に指定できる内容(最適化方法)については,「表3-40 SQL最適化オプションの指定値(CREATE TRIGGER)」を参照してください。
- すべての最適化を適用しない場合は,識別子に"NONE"を指定してください。ただし,同時に"NONE"以外の識別子を指定すると,"NONE"は無効になります。
- 識別子は大文字及び小文字で指定できます。
- 同じ識別子を二つ以上指定しても,一つ指定したものとみなされますが,なるべく同じ識別子は指定しないようにしてください。
- 数値で指定する場合:
OPTIMIZE LEVEL 符号なし整数〔,符号なし整数〕…
- <指定例>
- 複数のSQLオブジェクト作成,ANDの複数インデクス利用の抑止,及び複数インデクス利用の強制を適用する場合
符号なし整数をコンマで区切って指定する場合:
OPTIMIZE LEVEL 4,10,16
符号なし整数の和を指定する場合:
OPTIMIZE LEVEL 30
- 既に14(4+10)を指定していて,新たに16を追加する場合
OPTIMIZE LEVEL 14,16
- すべての最適化を適用しない場合
OPTIMIZE LEVEL 0
- <規則>
- バージョン06-00より前のHiRDBから,バージョン06-00以降のHiRDBにバージョンアップする場合,バージョン06-00より前の合計値指定も有効となります。最適化オプションを変更する必要がない場合は,バージョン06-00以降のHiRDBにバージョンアップしたときにこのオペランドの指定値を変更する必要はありません。
- 符号なし整数は一つ以上指定してください。
- 符号なし整数を二つ以上指定する場合は,コンマ(,)で区切ってください。
- 符号なし整数に指定できる内容(最適化方法)については,「表3-40 SQL最適化オプションの指定値(CREATE TRIGGER)」を参照してください。
- すべての最適化を適用しない場合は,符号なし整数に0を指定してください。ただし,同時に0以外の識別子を指定すると,0は無効になります。
- 同じ符号なし整数を二つ以上指定しても,一つ指定したものとみなされますが,なるべく同じ符号なし整数は指定しないようにしてください。
- 複数の最適化方法を指定する場合,その符号なし整数の和を指定することもできます。ただし,同じ最適化方法の値は二つ以上足さないでください(足した結果が別の最適化方法とみなされることもあるため)。
- 複数の最適化方法の値を足して指定する場合,どの最適方法を指定しているのか分かりにくくなるため,コンマで区切って指定する方法をお勧めします。また,既に複数の最適化方法の値を足して指定している場合で,新たに別の最適化方法が必要になったときは,追加する値をコンマで区切って後ろに指定できます。
-
- 《システム定義との関係》
- SQL最適化オプションを省略すると,システム定義のpd_optimize_levelオぺランドの指定値が仮定されます。pd_optimize_levelオペランドについては,マニュアル「HiRDB Version 8 システム定義」を参照してください。
- システム定義のpd_floatable_besオペランド,又はpd_non_floatable_besオペランドを指定している場合,「フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ)」及び「フロータブルサーバ対象限定(データ取り出しバックエンドサーバ)」の指定は無効となります。
- システム定義のpd_indexlock_modeオペランドにKEYを指定している場合(インデクスキー値排他の場合),「更新SQLの作業表作成抑止」の指定は無効になります。
- 《クライアント環境定義との関係》
- CREATE TRIGGERに対して,PDSQLOPTLVLの指定は無効となります。
- 《SQLとの関係》
- SQL文中にSQL最適化指定を指定している場合は,SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については,「2.24 SQL最適化指定」を参照してください。
- 《SQL最適化オプションの指定値》
- SQL最適化オプションの指定値を次の表に示します。各最適化方法の内容については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
表3-40 SQL最適化オプションの指定値(CREATE TRIGGER)
- 注※1
- フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ),及びフロータブルサーバ対象限定(データ取り出しバックエンドサーバ)を共に指定した場合,それぞれの最適化方法は有効にはなりません。代わりに,データ収集用サーバの分離機能として動作します。
- 注※2
- HiRDB/シングルサーバの場合,指定しても無効となります。
- 〔ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔,SQL拡張最適化オプション〕…〕
- データベースの状態を考慮して,最も効率的なアクセスパスを決定するための最適化の方法を指定します。
- SQL拡張最適化オプションは,識別子(文字列)で指定する方法と,数値で指定する方法があります。
-
- 識別子で指定する場合:
ADD OPTIMIZE LEVEL "識別子"〔,"識別子"〕…
- <指定例>
- 「コストベース最適化モード2の適用」及び「ハッシュジョイン,副問合せのハッシュ実行」を適用する場合
ADD OPTIMIZE LEVEL "COST_BASE_2","APPLY_HASH_JOIN"
- すべての最適化を適用しない場合
ADD OPTIMIZE LEVEL "NONE"
- <規則>
- 識別子は一つ以上指定してください。
- 識別子を二つ以上指定する場合は,コンマ(,)で区切ってください。
- 識別子に指定できる内容(最適化方法)については,「表3-41 SQL拡張最適化オプションの指定値(CREATE TRIGGER)」を参照してください。
- すべての最適化を適用しない場合は,識別子に"NONE"を指定してください。
- 識別子は大文字及び小文字で指定できます。
- 同じ識別子を二つ以上指定しても,一つ指定したものとみなされますが,なるべく同じ識別子は指定しないようにしてください。
-
- 数値で指定する場合:
ADD OPTIMIZE LEVEL 符号なし整数〔,符号なし整数〕…
- <指定例>
- 「コストベース最適化モード2の適用」及び「ハッシュジョイン,副問合せのハッシュ実行」を適用する場合
ADD OPTIMIZE LEVEL 1,2
- すべての最適化を適用しない場合
ADD OPTIMIZE LEVEL 0
- <規則>
- 符号なし整数は一つ以上指定してください。
- 符号なし整数を二つ以上指定する場合は,コンマ(,)で区切ってください。
- 符号なし整数に指定できる内容(最適化方法)については,「表3-41 SQL拡張最適化オプションの指定値(CREATE TRIGGER)」を参照してください。
- すべての最適化を適用しない場合は,符号なし整数に0を指定してください。
- 同じ符号なし整数を二つ以上指定しても,一つ指定したものとみなされますが,なるべく同じ符号なし整数は指定しないようにしてください。
-
- 《システム定義との関係》
- SQL拡張最適化オプションを省略すると,システム定義のpd_additional_optimize_levelオぺランドの指定値が仮定されます。pd_additional_optimize_levelオペランドについては,マニュアル「HiRDB Version 8 システム定義」を参照してください。
- 《クライアント環境定義との関係》
- CREATE TRIGGERに対して,PDADDITIONALOPTLVLの指定は無効となります。
- 《SQLとの関係》
- SQL文中にSQL最適化指定を指定している場合は,SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については,「2.24 SQL最適化指定」を参照してください。
- 《SQL拡張最適化オプションの指定値》
- SQL拡張最適化オプションの指定値を次の表に示します。各最適化方法の内容については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
表3-41 SQL拡張最適化オプションの指定値(CREATE TRIGGER)
項番 |
最適化方法 |
指定値 |
識別子 |
符号なし整数 |
1 |
コストベース最適化モード2の適用 |
"COST_BASE_2" |
1 |
2 |
ハッシュジョイン,副問合せのハッシュ実行 |
"APPLY_HASH_JOIN" |
2 |
3 |
値式に対する結合条件適用機能 |
"APPLY_JOIN_COND_FOR_VALUE_EXP" |
32 |
4 |
ジョインを含むSQL文の外部サーバ実行の抑止 |
"DETER_JOIN_SQL" |
67108864 |
5 |
直積を含むSQL文の外部サーバ実行の強制 |
"FORCE_CROSS_JOIN_SQL" |
134217728 |
6 |
無条件に生成する,外部サーバで実行できる探索高速化条件の導出の抑止 |
"DETER_FSVR_DERIVATIVE_COND" |
1073741824 |
- 注1
- 項番2〜6は,「コストベース最適化モード2の適用」を指定した場合,有効となります。
- 注2
- 項番4〜6は,外部表を検索する場合に有効となる最適化です。それ以外の場合は無効となります。
- 〔SUBSTR LENGTH 文字の最大長〕
- 1文字を表現する最大バイト数を指定します。
- 文字の最大長に指定できる値は,3〜6です。
- pdntenvコマンド(UNIX版の場合はpdsetupコマンド)で文字コード種別にutf-8を指定した場合にだけ有効となり,スカラ関数SUBSTRの結果の長さに影響します。SUBSTRについては,「2.16.1(21) SUBSTR」を参照してください。
- 《システム定義との関係》
- SUBSTR LENGTHを省略すると,システム定義のpd_substr_lengthオぺランドの指定値が仮定されます。pd_substr_lengthオペランドについては,マニュアル「HiRDB Version 8 システム定義」を参照してください。
- 《クライアント環境定義との関係》
- CREATE TRIGGERに対して,PDSUBSTRLENの指定は無効となります。PDSUBSTRLENについては,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
- 《pdntenvコマンド又はpdsetupコマンドで指定した文字コード種別との関係》
- 文字コード種別にutf-8を指定した場合だけ有効となります。
- そのほかの文字コード種別の場合は,構文チェックだけ行い,指定を無視します。
トリガ定義時に,そのトリガを定義する表を使用し,次のどれかの条件を満たす関数,手続き,及びトリガの有効なSQLオブジェクトがあれば,そのSQLオブジェクトを無効にする場合に指定します。
- トリガ契機がINSERTの場合,トリガを定義する表に対して行を挿入する関数,手続き,及びトリガ
- トリガ契機がUPDATEの場合,トリガを定義する表に対して行を更新する関数,手続き,及びトリガ
- トリガ契機がDELETEの場合,トリガを定義する表に対して行を削除する関数,手続き,及びトリガ
バージョン07-00より前のHiRDBでSQLオブジェクトを作成した関数及び手続きは,上記の条件を満たしていなくてもすべて無効にします。
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.