Check Constraints müssen deterministisch sein. Das heißt, eine bestimmte Zeile muss die Einschränkung immer erfüllen, oder sie muss die Einschränkung immer nicht erfüllen. Aber SYSDATE
ist von Natur aus nicht deterministisch, da sich der zurückgegebene Wert ständig ändert. Sie können also kein CHECK
definieren Einschränkung, die SYSDATE
aufruft oder jede andere benutzerdefinierte Funktion.
Wenn Sie versuchen, auf SYSDATE
zu verweisen in der Constraint-Definition erhalten Sie einen Fehler
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
Sie könnten einen CHECK
erstellen Einschränkung, bei der sowohl das minimale als auch das maximale Datum fest codiert wären, aber das wäre nicht besonders praktisch, da Sie die Einschränkung ständig löschen und neu erstellen müssten.
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.
Der praktische Weg, um diese Art von Anforderung durchzusetzen, wäre, einen Trigger für die Tabelle zu erstellen
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;