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;