SET CONSTRAINT[S]

目的

SET CONSTRAINTS文を使用すると、遅延可能な制約の検証を、各DML文の実行後に行うか(IMMEDIATE)、トランザクションのコミット時に行うか(DEFERRED)をトランザクションごとに指定できます。この文を使用して、制約名のリストまたはALL制約のモードを設定できます。

SET CONSTRAINTSモードは、トランザクションの存続期間中、または別のSET CONSTRAINTS文によってモードがリセットされるまで継続します。

ノート:

ALTER SESSION文でSET CONSTRAINTS句を使用して、すべての遅延可能制約を設定することもできます。これは、現在のセッションの各トランザクションの開始時にSET CONSTRAINTS文を発行することと同等です。

トリガー定義の内部でこの文を指定することはできません。

SET CONSTRAINTSは、分散型の文にすることができます。処理中のトランザクションを持つ既存のデータベース・リンクにはSET CONSTRAINTS ALL文の発行時にその発行が通知され、新しいリンクにはトランザクションの開始直後にその発行が通知されます。

前提条件

遅延可能な制約を検証する時期を指定する場合は、表が自分のスキーマ内にある必要があります。自分のスキーマ内にない場合は、制約が適用される表に対するREADまたはSELECT権限が必要です。

構文

set_constraints::=

セマンティクス

constraint

1つ以上の整合性制約の名前を指定します。

ALL

ALLを指定すると、このトランザクションに対するすべての遅延可能な制約を設定できます。

IMMEDIATE

IMMEDIATEを指定すると、指定された制約が、各制約DML文の実行時に即時にチェックされます。Oracle Databaseでは、チェック済のすべての制約に一貫性があり、他のSET CONSTRAINTS文が発行されていない場合、トランザクションで以前に遅延された制約が最初にチェックされ、その後すぐにそのトランザクションの他の文の制約チェックが継続してチェックされます。制約のチェックに失敗した場合は、エラーが通知されます。その時点で、COMMIT文を実行すると、トランザクション全体が元に戻されます。

COMMITを正常に実行できるかどうかをチェックする方法としてトランザクションの終了直後に制約を行います。制約をトランザクション内の最後の文としてIMMEDIATEに設定することで、予期しないロールバックを回避できます。いずれかの制約のチェックに失敗した場合は、トランザクションをコミットする前にエラーを解決できます。

DEFERRED

DEFERREDを指定すると、遅延可能な制約によって指定された条件が、トランザクションのコミット時に検証されます。

ノート:

SET CONSTRAINTS ALL IMMEDIATE文を発行することによって、遅延可能な制約をコミットする前に、それらの制約が完全に適用されたかどうかを検証できます。

制約の設定: 例

次の文は、このトランザクション内のすべての遅延可能な制約が、各DML文の直後に検証されるように設定します。

SET CONSTRAINTS ALL IMMEDIATE;

次の文は、トランザクションのコミット時に3つの遅延制約を検証します。この例では、制約をNOT DEFERRABLEに設定すると失敗します。

SET CONSTRAINTS emp_job_nn, emp_salary_min,
   hr.jhist_dept_fk@remote DEFERRED;