O que está errado com o meu o Oracle 10gR2 verificação de restrição? Tentar impor um intervalo de datas

StackOverflow https://stackoverflow.com/questions/207025

Pergunta

Eu quero impor restrição CHECK em um intervalo de datas de tal forma que todas as datas no birth_date coluna são menos do que amanhã e maior ou igual a 100 anos atrás. Eu tentei esta expressão em uma restrição CHECK:

BIRTH_DATE >= (sysdate - numtoyminterval(100, 'YEAR')) AND BIRTH_DATE < sysdate + 1

Mas eu recebi o erro "ORA-02436: data ou variável de sistema erroneamente especificado na restrição CHECK"

Existe uma maneira de fazer isso usando uma restrição CHECK em vez de um gatilho?

Foi útil?

Solução

A expressão restrição de verificação tem de ser determinista, então este tipo de deslizamento intervalo de datas não é enforcable em uma restrição de verificação. Do SQL Reference

Condições de restrições de verificação não pode conter as seguintes construções:

* Subqueries and scalar subquery expressions
* Calls to the functions that are not deterministic (CURRENT_DATE,

CURRENT_TIMESTAMP, DBTIMEZONE, LOCALTIMESTAMP, SESSIONTIMEZONE, SYSDATE, SYSTIMESTAMP, UID, USER, e USERENV)

Outras dicas

Quanto ao porquê da Oracle faz esta restrição: restrições de verificação deve sempre avaliar como TRUE, mesmo para atualizações. Se você adicionou um 99 anos de idade para o banco de dados, e depois tentou atualizar o endereço de e-mail da pessoa (por exemplo) em vez de 2 ano você receberia uma violação restrição de verificação.

O que você poderia fazer, se for o caso, é ter outro CREATED_DATE coluna que o padrão é SYSDATE, e fazer a restrição:

BIRTH_DATE >= (CREATED_DATE - numtoyminterval(100, 'YEAR')) 
AND BIRTH_DATE < CREATED_DATE + 1

No entanto, se você realmente só quer executar a verificação no tempo de inserção, em seguida, fazê-lo em um gatilho de banco de dados ou no código API.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top