チェック制約は決定論的でなければなりません。つまり、特定の行は常に制約を満たす必要があります。そうでない場合は、常に制約を満たすことができません。ただし、SYSDATE
戻り値は絶えず変化するため、本質的に非決定的です。したがって、CHECK
を定義することはできません。 SYSDATE
を呼び出す制約 またはその他のユーザー定義関数。
SYSDATE
を参照しようとした場合 制約定義では、エラーが発生します
SQL> ed
Wrote file afiedt.buf
1 create table t(
2 birth_date date check( birth_date between date '1900-01-01' and
3 sysdate )
4* )
SQL> /
sysdate )
*
ERROR at line 3:
ORA-02436: date or system variable wrongly specified in CHECK constraint
CHECK
を作成できます 最小日付と最大日付の両方がハードコーディングされている制約。ただし、制約を絶えず削除して再作成する必要があるため、これは特に実用的ではありません。
SQL> ed
Wrote file afiedt.buf
1 create table t(
2 birth_date date check( birth_date between date '1900-01-01' and
3 date '2011-12-08' )
4* )
SQL> /
Table created.
この種の要件を適用する実際的な方法は、テーブルにトリガーを作成することです
CREATE OR REPLACE TRIGGER check_birth_date
BEFORE INSERT OR UPDATE ON employee
FOR EACH ROW
BEGIN
IF( :new.emp_dob < date '1900-01-01' or
:new.emp_dob > sysdate )
THEN
RAISE_APPLICATION_ERROR(
-20001,
'EMployee date of birth must be later than Jan 1, 1900 and earlier than today' );
END IF;
END;