Oracle
 sql >> Database >  >> RDS >> Oracle

VERIFICA vincolo sulla data di nascita?

I vincoli di controllo devono essere deterministici. Cioè, una riga particolare deve sempre soddisfare il vincolo o non deve sempre soddisfare il vincolo. Ma SYSDATE è intrinsecamente non deterministico poiché il valore restituito è in continua evoluzione. Pertanto, non puoi definire un CHECK vincolo che chiama SYSDATE o qualsiasi altra funzione definita dall'utente.

Se provi a fare riferimento a SYSDATE nella definizione del vincolo, riceverai un errore

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

Potresti creare un CHECK vincolo in cui sia la data minima che quella massima erano codificate, ma ciò non sarebbe particolarmente pratico poiché dovresti costantemente eliminare e ricreare il vincolo.

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.

Il modo pratico per far rispettare questo tipo di requisito sarebbe creare un trigger sul tavolo

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;