constraint check para datas

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
heliolima
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sáb, 25 Abr 2009 9:57 pm
Localização: brasilia - df

estou tentando colocar uma constraint para campo date , e me retorna erro
pois quero que o campo só receba data anteriores ao dia de hoje.
não sei se é possivel usar variaveis de sistema .
abaixo o codigo que dá erro:

Selecionar tudo

alter table teste add  CONSTRAINT DATA_CHK CHECK (
data_op < sysdate);
grato
Helio de Souza Lima
skype: wwwheliolima
e-mail : helio_lima@bol.com.br
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Não é possível usar sysdate em uma check constraint.

Imagine o contrário: você quer inserir apenas valores na coluna que sejam maiores do que sysdate. Mas conforme o tempo passa, sysdate vai aumentando até eventualmente ultrapassar o valor que você inseriu na coluna, tornando a check inválida e o banco de dados inconsistente. Por isso não é permitido criar tal check constraint.

Há um workaround no 11g com uso do novo recurso de colunas virtuais, mas é preciso muito cuidade para não usá-lo no caso que expliquei acima para não dar m...
Dê uma olhada no link abaixo para entender melhor:
http://rwijk.blogspot.com/2007/12/check ... sdate.html

De qualquer forma, você pode fazer essa validação via trigger por exemplo, sem problemas.
heliolima
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sáb, 25 Abr 2009 9:57 pm
Localização: brasilia - df

valeu pela dica, vou tentar fazer a validacao por trigger. não tinha pensado nisso
heliolima
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sáb, 25 Abr 2009 9:57 pm
Localização: brasilia - df

tentei fazer a trigger mas está dando erro

Selecionar tudo

create or replace TRIGGER data_invalida
      Before Insert   on  teste
     FOR EACH ROW
 
 Declare 
  v_data_op  number;
  v_hoje number;

Begin
 select    to_number( TO_CHAR(new:data_op, 'yyyymmdd')) into  v_data_op from dual;
 select    to_number( TO_CHAR(sysdate, 'yyyymmdd')) into  v_hoje from dual;

If   (      v_data_op =  v_hoje  )    Then
    Raise_Application_Error(-20000,'-->>>   A DATA não PODE SER MAIOR QUE A DATA ATUAL    <<<---'  );
     
   End If;
End;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes