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つ以上の整合性制約の名前を指定します。
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;