CREATE TRIGGERおよびREPLACE TRIGGERの構文要素 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
ft:locale
ja-JP
ft:lastEdition
2021-09-23
dita:mapPath
ja-JP/spp1591731285373.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1144
Product Category
Software
Teradata Vantage
database_name_1
トリガーが現行ユーザーのデフォルト以外のデータベースで作成されている場合のオプションの修飾子。
trigger_name
作成または置換されるトリガーの名前。
データベース オブジェクトの命名ルールについては、<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。
trigger_nameは、それが作成されるデータベース内で固有であることが必要です。
ENABLED
トリガーの実行を可能にするキーワード。
ENABLEDはデフォルトです。
DISABLED
トリガーの実行を不可にするキーワード。
使用不能にされたトリガーの定義は除去されませんが、使用可能にしてからでなければ実行できません(ALTER TRIGGERを参照)。
BEFORE
トリガー イベントまたはトリガー文より前にトリガーを実行するように指定します。
  • BEFORE行トリガーには、トリガー対象のアクションSQL文としてデータ変更文を定義することはできません。
  • BEFORE文トリガーは、どんな場合でも無効です。
データベースはどちらの場合もエラー メッセージを返します。
AFTER
トリガー イベントの後にトリガーが実行されます。
temporal_option
これらのオプションの資料については、<Teradata Vantage™ - テンポラル テーブル サポート、B035-1182>を参照してください。

triggering_event

トリガー イベントまたはトリガー文には、INSERT、DELETE、UPDATE、MERGEリクエストのいずれかを指定できます。テンポラル テーブルに対してトリガーする文に適用するルールの資料については、<Teradata Vantage™ - テンポラル テーブル サポート、B035-1182>を参照してください。

INSERT
このトリガーのトリガー イベントは、以下のいずれかです:
  • INSERT
  • INSERT SELECT
  • Atomic Upsert
  • MERGE
DELETE
このトリガーのトリガー イベントはDELETEです。
UPDATE
このトリガーのトリガー文は、以下のいずれかです:
  • UPDATE
  • Atomic Upsert
  • MERGE
任意の数の行(ゼロ行でもよい)を更新できます。
column_name
列名のセットにある列の名前。
リスト内の列が更新されると、トリガーが起動します。
任意指定で、リストを括弧で囲むこともできます。
列名のリストを指定しない場合は、デフォルトですべての列が対象になります。
リストでは、重複する列名を指定することはできません。
column_nameリストは、INSERTまたはDELETEトリガー イベントには適用されません。
database_name_2
対象のテーブルに対するオプションの修飾子。
対象のテーブルが現在のユーザーのデフォルト以外のデータベースに含まれる場合、この指定は必須です。
table_name
このトリガーに関連する対象テーブルの名前。
table_nameは既存の基本テーブルの名前でなければなりません。
table_nameが参照するオブジェクトは、以下のいずれにも指定することはできません。
  • グローバル一時テーブル
  • ハッシュ インデックス
  • 結合インデックス
  • 再帰ビュー
  • キュー テーブル
  • トレース テーブル
  • ビュー
  • 揮発テーブル
ORDER

ORDER値は、複数のトリガーに同じトリガー アクション時間とトリガー イベントがある場合に、実行シーケンスを決めます。

複数のトリガーに同じORDER値、トリガー アクション時間、およびトリガー イベントが指定されている場合、それらは作成のタイムスタンプの順序で実行されます。
integer
ORDERに割り当てられる値。
この値は、32,767以下の正のsmall integerでなければなりません。
ORDER句が指定されない場合、システムはトリガーにデフォルト値の32,767を割り当てます。

reference

RFERENCING句では、WHEN条件やトリガーで起動されるアクションから、1つ以上の遷移テーブルにある行のセットを参照します。この句はオプションで、デフォルトはありません。

この句のセマンティクスはテンポラル テーブルと非テンポラル テーブルで同じです。

OLD [ ROW ] [AS] old_transition_variable_name
変更前の現在の行(遷移行)の相関名を指定します。
DELETE、MERGE UPDATE、およびUPDATEイベントのROWトリガーにのみ有効です。
正規化Period列は、OLD [ ROW ]に指定できます。
NEW [ ROW ] [AS] new_transition_variable_name
変更後の現在の行(遷移行)の相関名を指定します。
INSERT、MERGE INSERT、MERGE UPDATE、およびUPDATEイベントのROWトリガーにのみ有効です。
正規化Period列は、NEW [ ROW ]に指定できません。
OLD_TABLE
OLD TABLE
古い値の遷移テーブルのテーブル相関名を指定する同等のキーワード。
OLD TABLEは、ANSI SQL-2011規格で指定されている形式です。
OLD_TABLEは、下位互換性のために保持されているTeradata拡張機能です。
OLD_TABLE参照またはOLD TABLE参照は、文トリガーと行トリガーの両方で指定できます。
正規化Period列は、OLD TABLEまたはOLD_TABLEに指定できます。
OLD_TABLEおよびOLD TABLEが有効なのは、DELETE、MERGE UPDATEおよびUPDATEトリガー イベントだけです。
old_transition_table_name
古い値の遷移テーブルを参照するために、OLD TABLEオプションまたはOLD_TABLEオプションで指定するテーブル別名。
NEW_TABLE
NEW TABLE
新しい値の遷移テーブルのテーブル相関名を指定する同等のキーワード。
NEW TABLE は、ANSI SQL:2011規格で指定されている形式です。
NEW_TABLEは、下位互換性のために保持されているTeradata拡張機能です。
NEW_TABLE参照またはNEW TABLE参照は、文トリガーと行トリガーの両方で指定できます。
正規化Period列は、NEW ROW TABLEまたはNEW_TABLEには指定できません。
NEW_TABLEおよびNEW TABLEが有効なのは、INSERT、MERGE INSERT、MERGE UPDATEおよびUPDATEトリガー イベントだけです。
new_transition_table_name
新しい値の遷移テーブルを参照するために、NEW TABLEオプションまたはNEW_TABLEオプションで指定するテーブル別名。
OLD_NEW_TABLE
古い値および新しい値の遷移テーブルのテーブル相関名を指定します。
AFTER UPDATEトリガーには、OLD_NEW_TABLE参照だけを指定できます。
この句は、NEW TABLE構文およびOLD TABLE構文の文トリガーに対して次の2つの利点を提供します。
  • 文トリガーを可能にし、すべての古い値と新しい値を単一行に格納します。
  • 遷移テーブルと文トリガー間の自己結合を行なう必要がなくなります。
  • 古い値と、影響を受けるすべての行における新しい値を比較するのではなく、古い値と、影響を受ける行におけるこれに対応する新しい値を比較する機能を使用可能にします。
old_new_table_name
同じ行にある古い値と新しい値の遷移テーブルを参照するために、OLD_NEW_TABLEオプションで指定するテーブル別名。
old_value
OLD TABLEとNEW TABLEの遷移テーブルの行の特定の古い値の列を参照するときに使用できる列別名。
new_value
OLD TABLEとNEW TABLEの遷移テーブルの行にある特定の新しい値の列を参照するときに使用できる列別名。
FOR EACH ROW
トリガーが、適格な行ごとに起動します。適格な行とは、トリガーに指定されたWHEN条件がTRUEと評価される行です。
FOR EACH STATEMENTはデフォルトです。
FOR EACH STATEMENT
トリガーのWHEN条件がTRUEと評価されるときは、リクエスト内の処理済みSQL文ごとにトリガーが1度起動します。
FOR EACH STATEMENTはデフォルトです。
WHEN (search_condition)
トリガーの起動条件をさらに詳細化するロジック。
search_conditionは、トリガー定義の範囲内のアイテム比較に基づいた有効な検索条件を表すブール条件です。トリガーは、search_conditionの値がTRUEの場合にのみ起動します。
サブクエリー内にない場合、search_conditionの列をold_transition_variable_nameまたはnew_transition_variable_nameのいずれかで修飾する必要があります。例:
CREATE TRIGGER RaiseTrig
  AFTER UPDATE OF salary ON employee
  REFERENCING OLD AS OldRow NEW AS NewRow
  FOR EACH ROW
    WHEN ((NewRow.salary - OldRow.salary) / OldRow.salary >.10)
    INSERT INTO salary_log
    VALUES ('USER', NewRow.name, OldRow.salary, NewRow.salary);
search_conditionには、サブクエリー内の集計のみを含めることができます。search_conditionからOLD TABLEまたはNEW TABLE遷移テーブルを参照する場合は、述語をサブクエリーとして表現する必要があります。WHEN条件は必ず単一の結果を出力するので、OLD TABLEとNEW TABLE列参照の典型的な使用法は、集約を指定する方法です。
search_conditionには、UDTの順序が定義されている場合にのみ、UDT比較を含めることができます。CREATE ORDERINGおよびREPLACE ORDERINGを参照してください。
トリガーが行トリガーの場合、search_conditionは現在の行の行相関名に基づきます。
search_conditionは、次のそれぞれにつき1度評価されます。
  • トリガー文の実行(文トリガーの場合)
  • 変更行の入った遷移テーブルの行(行トリガーの場合)
trigger_action
ANSI SQL:2011仕様では、複数の文をBEGIN ATOMICキーワードとENDキーワードで囲むことが定められています。Vantageはこれに準拠していますが、複数のSQLプロシージャ文をBEGIN ATOMICキーワードとENDキーワードで囲まないで指定することも可能です。
SQLプロシージャ文リストの中の各トリガー アクション文は、それぞれセミコロン(;)で終了している必要があります。
SQLプロシージャ文のリストは、括弧で囲んでも囲まなくても指定できます。
BTEQでは、SQLプロシージャ文のリストを括弧で囲まない場合、各文の直後の行は次の規則に従う必要があります。
  • 前の行を終了するセミコロン文字で始まる必要があります。
  • リスト内で次にトリガーされるアクション文を指定する必要があります。
UDT式はトリガーされるSQL文内で有効です。
トリガーされるSQL文のテンポラル テーブルでの使用法の詳細と使用例については、<Teradata Vantage™ - テンポラル テーブル サポート、B035-1182>を参照してください。
BEGIN ATOMIC
複数のトリガー アクション文を指定するキーワード。
トリガーされるSQL文の句の先頭にBEGIN ATOMICを指定した場合には、ENDキーワードでそれを終了する必要があります。
SQL_procedure_statement
1つ以上の有効なトリガーされるアクション文。
END
BEGIN ATOMICキーワードによって開始する文ブロックを終了するためのキーワード。
BEGIN ATOMICを使用した場合には、トリガーされるSQL文の句を終了するために、ENDを指定する必要があります。