Oracle
 sql >> Base de données >  >> RDS >> Oracle

CHECK contrainte sur date de naissance ?

Les contraintes de contrôle doivent être déterministes. Autrement dit, une ligne particulière doit toujours satisfaire la contrainte ou elle doit toujours échouer à satisfaire la contrainte. Mais SYSDATE est intrinsèquement non déterministe puisque la valeur renvoyée change constamment. Ainsi, vous ne pouvez pas définir un CHECK contrainte qui appelle SYSDATE ou toute autre fonction définie par l'utilisateur.

Si vous essayez de référencer SYSDATE dans la définition de la contrainte, vous obtiendrez une erreur

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

Vous pouvez créer un CHECK contrainte où la date minimale et la date maximale étaient codées en dur, mais cela ne serait pas particulièrement pratique car vous devriez constamment supprimer et recréer la contrainte.

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.

Le moyen pratique d'appliquer ce type d'exigence serait de créer un déclencheur sur la table

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;