MERGEリクエストは、トリガーを起動するためのトリガー文として使用できますが、できません文としては使用できません。
MERGEリクエストが実行されるとき、WHEN MATCHED句が指定されている場合は、UPDATEアクションで定義されたトリガーがアクティブ化され、WHEN NOT MATCHED句が指定されている場合は、INSERTアクションで定義されたトリガーがアクティブ化されます。
UPDATEトリガーおよびINSERTトリガーがアクティブ化される順序は、MERGE文のWHEN MATCHED句およびWHEN NOT MATCHED句の順序と同じです。
MERGEを指定したTeradata実装と、MERGEを指定したトリガーの実装のANSI SQL:2011規格との間には、わずかな違いがあります。ANSI SQL:2011規格では、トリガーを次のようにMERGEリクエストで実装することを推奨しています。
ターゲット テーブルに対して行の更新と新しい行の挿入が発生したときに指定される最初の句 |
マージ中のアクションのシーケンス |
WHEN MATCHED (UPDATE指定) |
- UPDATEアクションに関連するすべてのBEFOREトリガーが適用されます。
- UPDATE指定で指定された更新が適用されます。
- 制約がチェックされ、場合によっては参照アクションの実行という結果になります。
- UPDATEアクションに関連するAFTERトリガーが適用されます。
- INSERTアクションに関連するBEFOREトリガーが適用されます。
- INSERT指定で指定された挿入が適用されます。
- 制約がチェックされ、場合によっては参照アクションの実行という結果になります。
- INSERTアクションに関連するAFTERトリガーが適用されます。
|
WHEN NOT MATCHED (INSERT指定) |
- INSERTアクションに関連するBEFOREトリガーが適用されます。
- INSERT指定で指定された挿入が適用されます。
- 制約がチェックされ、場合によっては参照アクションの実行という結果になります。
- INSERTアクションに関連するAFTERトリガーが適用されます。
- UPDATEアクションに関連するすべてのBEFOREトリガーが適用されます。
- UPDATE指定で指定された更新が適用されます。
- 制約がチェックされ、場合によっては参照アクションの実行という結果になります。
- UPDATEアクションに関連するAFTERトリガーが適用されます。
|
一方、Teradata Databaseは次のようにMERGEリクエストにトリガーを実装します。
ターゲット テーブルに対して行の更新と新しい行の挿入が発生したときに指定される最初の句 |
マージ中のアクションのシーケンス |
WHEN MATCHED (UPDATE指定) |
- UPDATEアクションに関連するすべてのBEFOREトリガーが適用されます。
- INSERTアクションに関連するすべてのBEFOREトリガーが適用されます。
- UPDATE指定で指定された更新が適用されます。
- 制約がチェックされ、場合によっては参照アクションの実行という結果になります。
- INSERT指定で指定された挿入が適用されます。
- 制約がチェックされ、場合によっては参照アクションの実行という結果になります。
- UPDATEアクションに関連するAFTERトリガーが適用されます。
- INSERTアクションに関連するAFTERトリガーが適用されます。
|
WHEN NOT MATCHED (INSERT指定) |
- INSERTアクションに関連するすべてのBEFOREトリガーが適用されます。
- UPDATEアクションに関連するすべてのBEFOREトリガーが適用されます。
- UPDATE指定で指定された更新が適用されます。
- 制約がチェックされ、場合によっては参照アクションの実行という結果になります。
- INSERT指定で指定された挿入が適用されます。
- 制約がチェックされ、場合によっては参照アクションの実行という結果になります。
- INSERTアクションに関連するAFTERトリガーが適用されます。
- UPDATEアクションに関連するAFTERトリガーが適用されます。
|
MERGE文については、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>の「MERGE」を参照してください。