Что не так с моим ограничением проверки Oracle 10gr2? Пытаясь применить диапазон дат - PullRequest
3 голосов
/ 16 октября 2008

Я хочу применить ограничение CHECK для диапазона дат, чтобы все даты в столбце BIRTH_DATE были меньше, чем завтра, и были больше или равны 100 лет назад. Я пробовал это выражение в ограничении CHECK:

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

Но я получил ошибку "ORA-02436: дата или системная переменная неправильно указаны в ограничении CHECK"

Есть ли способ сделать это, используя ограничение CHECK вместо триггера?

Ответы [ 2 ]

5 голосов
/ 16 октября 2008

Что касается того, почему Oracle устанавливает это ограничение: проверочные ограничения должны всегда иметь значение ИСТИНА, даже для обновлений. Если вы добавите в базу данных 99-летний пользователь, а затем попытаетесь обновить адрес электронной почты этого человека (например, через 2 года), вы получите нарушение проверочного ограничения.

Что вы могли бы сделать, если это уместно, иметь другой столбец CREATED_DATE, который по умолчанию равен SYSDATE, и установить ограничение:

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

Однако, если вы действительно хотите выполнить проверку только во время INSERT, сделайте это в триггере базы данных или в коде API.

3 голосов
/ 16 октября 2008

Выражение проверочного ограничения должно быть детерминированным, поэтому этот вид скользящего диапазона дат не может быть применен в проверочном ограничении. Из справочника SQL

Условия проверки ограничений не могут содержат следующие конструкции:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...