3.8.3. トリガー
トリガーの表示
ビューは、物理ソースよりも抽象化です。通常、複数のデータソースまたは他のビューから情報を結合したり、複数のテーブルから情報を結合したりします。Data Virtualization は、ビューに対して更新操作を実行できます。ビュー(INSERT
、UPDATE
、または DELETE
)に対して実行するコマンドを更新するには、ビューが統合したテーブルとビューが各タイプのコマンドに影響を与える方法を定義するロジックが必要です。この変換ロジック( トリガー とも呼ばれる)は、ビューに対して更新コマンドが実行されると呼び出されます。更新手順では、ビューに対して実行する更新コマンドが、基礎となる物理ソースに対して実行する個々のコマンドに記述されるロジックを定義します。仮想手順と同様に、更新手順は、クエリーやその他のコマンドの実行、一時テーブルの定義、一時テーブルへのデータの追加、結果セットの実行、ループの使用、条件付きロジックの使用などを実行できます。仮想手順の詳細は、「仮想手順」を参照し て ください。
INSTEAD OF
トリガーは、従来のデータベースで使用するのと同じ方法で、ビュー上でトリガーできます。ビューに対して、1 つの INSERT
、UPDATE
、または DELETE
操作ごとに FOR EACH ROW
手順を 1 つだけ指定できます。
用途
CREATE TRIGGER ON view_name INSTEAD OF INSERT|UPDATE|DELETE AS FOR EACH ROW ...
CREATE TRIGGER ON view_name INSTEAD OF INSERT|UPDATE|DELETE AS
FOR EACH ROW
...
更新手順の処理
- ユーザーアプリケーションは SQL コマンドを送信します。
- このコマンドは、実行されたビューを検出します。
-
コマンドタイプに応じて正しい手順が選択されます(
INSERT
、UPDATE
、またはDELETE
)。 - 手順が実行されます。この手順には独自の SQL コマンドが含まれる可能性があります。この手順のコマンドは、呼び出したアプリケーションから受け取るコマンドのタイプとは異なります。
- この手順で説明されているように、コマンドは、個々の物理データソースまたはその他のビューに発行されます。
- 変更された行数を表す値は、呼び出したアプリケーションに返されます。
ソーストリガー
Data Virtualization は、ソーステーブルで AFTER
トリガーを使用できます。AFTER
トリガーは、変更データキャプチャー(CDC)システムからイベントによって呼び出されます。
使用方法
CREATE TRIGGER ON source_table AFTER INSERT|UPDATE|DELETE AS FOR EACH ROW ...
CREATE TRIGGER ON source_table AFTER INSERT|UPDATE|DELETE AS
FOR EACH ROW
...
FOR EACH ROW トリガー
FOR EACH ROW
コンストラクトのみがトリガーハンドラーとして機能します。FOR EACH ROW
トリガー手順は、UPDATE
ステートメントの影響を受けるビュー/ソースの各行のブロックを評価します。UPDATE
および DELETE
ステートメントでは、WHERE
条件を渡すすべての行になります。INSERT
ステートメントには、VALUES
またはクエリー式からの値セットごとに新しい行が 1 つ含まれます。ビューの場合、基礎となる手順ロジックの影響に関係なく、更新された行がこの数として報告されます。
用途
FOR EACH ROW BEGIN ATOMIC ... END
FOR EACH ROW
BEGIN ATOMIC
...
END
BEGIN
キーワードおよび END
キーワードは、ブロック境界を示すために使用されます。この手順の本文内では、有効なステートメントを使用できます。
ATOMIC
キーワードの使用は現時点で後方互換性のためにオプションですが、通常のブロックとは異なり、INSTEAD OF
トリガーのデフォルト値は atomic です。
更新手順の特別な変数
更新手順を定義する際に、いくつかの特殊な変数を使用できます。
- NEW 変数
定義する
UPDATE
およびINSERT
変換を持つ view/table のすべての属性にはNEW.<column_name> という名前の同等の変数があります
。INSERT または UPDATE コマンドがビューに対して実行されるか、またはイベントを受信すると、これらの変数はそれぞれ
INSERT VALUES
句またはUPDATE SET
句の値に初期化されます。UPDATE
手順では、これらの変数のデフォルト値(コマンドで設定されていない場合)は古い値になります。INSERT 手順では、これらの変数のデフォルト値は仮想テーブル属性のデフォルト値です。渡された値とデフォルト値を区別するには、この一覧のCHANGING
変数を参照してください。- OLD 変数
定義する
UPDATE
およびDELETE
変換のすべての view/table 属性には、OLD.<column_name> という名前の同等の変数があります
。ビューに対して
DELETE
またはUPDATE
コマンドを実行すると、イベントを受信すると、これらの変数は削除または更新される行の現在の値にそれぞれ初期化されます。- CHANGING 変数
定義する
UPDATE
およびINSERT
変換を持つ view/table のすべての属性には、CHANGING.<column_name> という名前の同等の変数があります
。INSERT
またはUPDATE
コマンドがビューに対して実行されるか、またはイベントを受け取ると、INPUT
変数がコマンドによって設定されているかによって、これらの変数はtrue
またはfalse
に初期化されます。CHANGING
変数は通常、デフォルトの挿入値とユーザークエリーで指定されたものを区別するために使用されます。たとえば、A、B、C のコラムのあるビューの場合は以下のようになります。
Expand ユーザー実行時... then… VT(A、B)の値(0、1)に挿入します。
CHANGING.A = true, CHANGING.B = true, CHANGING.C = false
UPDATE VT SET C = 2
CHANGING.A = false, CHANGING.B = false, CHANGING.C = true
- キー変数
INSERT
トリガーから生成されたキーを返すには、KEY グループが利用でき、返された値を割り当てることができます。通常、これにはgenerated_key
システム機能を使用する必要があります。ただし、すべてのソースが生成されたキーを返すわけではないので、すべての挿入が生成されたキーを提供するわけではありません。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
更新手順の例
たとえば、A、B、C のコラムのあるビューの場合は以下のようになります。
DELETE の手順例
FOR EACH ROW BEGIN DELETE FROM X WHERE Y = OLD.A; DELETE FROM Z WHERE Y = OLD.A; // cascade the delete END
FOR EACH ROW
BEGIN
DELETE FROM X WHERE Y = OLD.A;
DELETE FROM Z WHERE Y = OLD.A; // cascade the delete
END
UPDATE の手順例
その他の使用方法
ビューの FOR EACH ROW
更新手順を使用して、固有の更新を実行する機能を維持しながら、各行トリガーをエミュレートすることもできます。この
BEFORE/AFTER
トリガー動作は、フォームの更新手順を使用してターゲットビューに追加のアップデータブルビューを作成することで実行できます。