Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

VERIFICAR restrição na data de nascimento?


As restrições de verificação devem ser determinísticas. Ou seja, uma linha específica sempre deve satisfazer a restrição ou sempre deve deixar de satisfazer a restrição. Mas SYSDATE é inerentemente não determinístico, pois o valor retornado está mudando constantemente. Assim, você não pode definir um CHECK restrição que chama SYSDATE ou qualquer outra função definida pelo usuário.

Se você tentar fazer referência a SYSDATE na definição de restrição, você receberá um erro
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

Você pode criar um CHECK restrição em que a data mínima e máxima foram codificadas, mas isso não seria particularmente prático, pois você teria que descartar e recriar constantemente a restrição.
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.

A maneira prática de impor esse tipo de requisito seria criar um gatilho na tabela
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;