O que está errado com o meu o Oracle 10gR2 verificação de restrição? Tentar impor um intervalo de datas
-
03-07-2019 - |
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?
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.