Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Einschränkung auf Geburtsdatum PRÜFEN?

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;