この付録では、 更新操作の結果として生じる可能性のある参照制約および検査制約とトリガーとの相互作用について説明します。 図 17 とその後の説明は、 データベースのデータを更新する SQL ステートメントに対して行われる典型的な処理を示しています。
図 17. 関連するトリガーと制約を伴う SQL ステートメントの処理
図 17 は、 表を更新する SQL ステートメントの一般的な処理の順序を示しています。 ここでは、表に、「BEFORE」のトリガー、参照制約、検査制約、 およびカスケードする「AFTER」トリガーとが含まれることを想定しています。 図 17 に示されているボックスやその他の項目について、 以下に説明します。
これは、その処理を開始する DELETE、INSERT、または UPDATE ステートメントです。 SQL ステートメント S1 は、 この説明において ターゲット表 と呼ぶ表 (または表に対する更新可能な視点) を指定しています。
このステップは、CASCADE および SET NULL の参照制約の削除規則と、 AFTER トリガーからカスケードした SQL ステートメントについて繰り返される処理の開始点です。
このステップの目的は、 その SQL ステートメントで影響を受ける行の集合 を決定することです。 SAR に含まれる行の集合には、 以下の基準で行が含められます。
SAR が空の場合、 BEFORE トリガー、ターゲット表に適用される変更、 または SQL ステートメントの処理に対する制約はありません。
BEFORE トリガーの処理はすべて作成の昇順で行われます。 各 BEFORE トリガーは、 SAR 内の各行ごとに 1 回ずつトリガー・アクションを処理します。
トリガー・アクションの処理の過程でエラーが生じることがあり、 そのような場合には元の SQL ステートメント S1 の 結果としての変更内容 (これまでの) がすべてロールバックされます。
BEFORE トリガーがない場合、 または SAR が空の場合、このステップはスキップされます。
実際の削除、挿入、または更新は、 SAR を使ってデータベース内のターゲット表に適用されます。
SAR の適用時にエラーが生じることがあり (固有索引のある場所に 重複するキーを持つ行を挿入しようとした場合など)、 そのような場合は元の SQL ステートメント S1 の 結果としての変更内容 (これまでの) がすべてロールバックされます。
SAR が空の場合には、 ターゲット表に関連した制約が適用されます。 この制約には、固有制約、固有索引、参照制約、検査制約、 視点に対する WITH CHECK OPTION に関連した検査などがあります。 カスケードまたは NULL 設定の削除規則の参照制約があると、 さらに別のトリガーが起動される場合があります。
索引または WITH CHECK OPTION に違反があると、エラーが発生し、 S1 の結果としての 変更内容 (これまでの) がすべてロールバックされます。
S1 によって活動化された AFTER トリガーは、 作成の昇順に処理されます。
FOR EACH STATEMENT トリガーでは、SAR が空の場合にも、 1 回だけトリガー・アクションが処理されます。 FOR EACH ROW トリガーでは、 SAR 内の各行ごとに 1 回ずつトリガー・アクションが処理されます。
トリガー・アクションの処理の過程でエラーが生じることがあり、そのような場合は 元の S1 の 結果としての変更内容 (これまでの) がすべてロールバックされます。
トリガーのトリガー・アクションには、トリガーによって実行される DELETE、INSERT、 または UPDATE などの SQL ステートメントが含まれている場合があります。 この説明では、そのようなステートメントは、 カスケードした SQL ステートメント とみなされます。
カスケードした SQL ステートメントとは、 AFTER トリガーのトリガー・アクションの一部として処理される DELETE、 INSERT、または UPDATE ステートメントのことです。 そのステートメントによって、カスケード・レベルのトリガー処理が開始されます。 これは、 新しい S1 としてトリガー SQL ステートメントを割り当てて、 ここで説明した手順をすべて再帰的に実行することと見なすことができます。
各 S1 ごとに起動される すべての AFTER トリガーによって実行されるすべての SQL ステートメントの処理が完了すると、 元の S1 の処理が完了します。
制約違反も含めて、処理中にエラーが発生すると、 元の SQL ステートメント S1 の結果として 直接または間接になされたすべての変更がロール・バックされます。 その場合、データベースは、 元の SQL ステートメント S1 の 実行直前と同じ状態に戻ります。