3.8.3. トリガー


トリガーの表示

ビューは、物理ソースよりも抽象化です。通常、複数のデータソースまたは他のビューから情報を結合したり、複数のテーブルから情報を結合したりします。Data Virtualization は、ビューに対して更新操作を実行できます。ビュー(INSERTUPDATE、または DELETE)に対して実行するコマンドを更新するには、ビューが統合したテーブルとビューが各タイプのコマンドに影響を与える方法を定義するロジックが必要です。この変換ロジック( トリガー とも呼ばれる)は、ビューに対して更新コマンドが実行されると呼び出されます。更新手順では、ビューに対して実行する更新コマンドが、基礎となる物理ソースに対して実行する個々のコマンドに記述されるロジックを定義します。仮想手順と同様に、更新手順は、クエリーやその他のコマンドの実行、一時テーブルの定義、一時テーブルへのデータの追加、結果セットの実行、ループの使用、条件付きロジックの使用などを実行できます。仮想手順の詳細は、「仮想手順」を参照し ください。

INSTEAD OF トリガーは、従来のデータベースで使用するのと同じ方法で、ビュー上でトリガーできます。ビューに対して、1 つの INSERTUPDATE、または DELETE 操作ごとに FOR EACH ROW 手順を 1 つだけ指定できます。

用途

CREATE TRIGGER ON view_name INSTEAD OF INSERT|UPDATE|DELETE AS
FOR EACH ROW
...
Copy to Clipboard Toggle word wrap

更新手順の処理

  1. ユーザーアプリケーションは SQL コマンドを送信します。
  2. このコマンドは、実行されたビューを検出します。
  3. コマンドタイプに応じて正しい手順が選択されます(INSERTUPDATE、または DELETE)。
  4. 手順が実行されます。この手順には独自の SQL コマンドが含まれる可能性があります。この手順のコマンドは、呼び出したアプリケーションから受け取るコマンドのタイプとは異なります。
  5. この手順で説明されているように、コマンドは、個々の物理データソースまたはその他のビューに発行されます。
  6. 変更された行数を表す値は、呼び出したアプリケーションに返されます。

ソーストリガー

Data Virtualization は、ソーステーブルで AFTER トリガーを使用できます。AFTER トリガーは、変更データキャプチャー(CDC)システムからイベントによって呼び出されます。

使用方法

CREATE TRIGGER ON source_table AFTER INSERT|UPDATE|DELETE AS
FOR EACH ROW
...
Copy to Clipboard Toggle word wrap

FOR EACH ROW トリガー

FOR EACH ROW コンストラクトのみがトリガーハンドラーとして機能します。FOR EACH ROW トリガー手順は、UPDATE ステートメントの影響を受けるビュー/ソースの各行のブロックを評価します。UPDATE および DELETE ステートメントでは、WHERE 条件を渡すすべての行になります。INSERT ステートメントには、VALUES またはクエリー式からの値セットごとに新しい行が 1 つ含まれます。ビューの場合、基礎となる手順ロジックの影響に関係なく、更新された行がこの数として報告されます。

用途

FOR EACH ROW
   BEGIN ATOMIC
      ...
   END
Copy to Clipboard Toggle word wrap

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 のすべての属性には、CHAN GING.<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 システム機能を使用する必要があります。ただし、すべてのソースが生成されたキーを返すわけではないので、すべての挿入が生成されたキーを提供するわけではありません。

create view v1 (i integer, k integer not null auto_increment primary key)
OPTIONS (UPDATABLE true) as
   select x, y from tbl;
create trigger on v1 instead of insert as
   for each row begin atomic
      -- ... some logic
      insert into tbl (x) values (new.i);
      key.k = cast(generated_key('y') as integer);
   end;
Copy to Clipboard Toggle word wrap

更新手順の例

たとえば、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
Copy to Clipboard Toggle word wrap

UPDATE の手順例

FOR EACH ROW
BEGIN
    IF (CHANGING.B)
    BEGIN
        UPDATE Z SET Y = NEW.B WHERE Y = OLD.B;
    END
END
Copy to Clipboard Toggle word wrap

その他の使用方法

ビューの FOR EACH ROW 更新手順を使用して、固有の更新を実行する機能を維持しながら、各行トリガーをエミュレートすることもできます。この BEFORE/AFTER トリガー動作は、フォームの更新手順を使用してターゲットビューに追加のアップデータブルビューを作成することで実行できます。

CREATE TRIGGER ON outerVW INSTEAD OF INSERT AS
FOR EACH ROW
    BEGIN ATOMIC
    --before row logic
    ...

    --default insert/update/delete against the target view
    INSERT INTO VW (c1, c2, c3) VALUES (NEW.c1, NEW.c2, NEW.c3);

    --after row logic
    ...
    END
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat