sql >> Base de Datos >  >> RDS >> Oracle

CHECK restricción en la fecha de nacimiento?

Las restricciones de comprobación deben ser deterministas. Es decir, una fila en particular siempre debe satisfacer la restricción o siempre debe fallar en satisfacer la restricción. Pero SYSDATE es inherentemente no determinista ya que el valor devuelto cambia constantemente. Por lo tanto, no puede definir un CHECK restricción que llama a SYSDATE o cualquier otra función definida por el usuario.

Si intenta hacer referencia a SYSDATE en la definición de la restricción, obtendrá un error

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

Podrías crear un CHECK restricción donde tanto la fecha mínima como la máxima estaban codificadas, pero eso no sería particularmente práctico ya que tendría que eliminar y recrear constantemente la restricción.

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.

La forma práctica de hacer cumplir este tipo de requisito sería crear un activador en la mesa

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;