проверить ограничение для проверки вставленной даты

Я хочу проверить, что день рождения пользователя должен быть больше 18 лет. Я использовал ниже упомянутое ограничение проверки.

(FLOOR((MONTHS_BETWEEN(DOB,SYSDATE))/12))>=18

Дата рождения: поле в таблице для даты рождения.

но произошла следующая ошибка:

DOB является недопустимым идентификатором.

Спасибо!


person Himadri Porania    schedule 02.03.2013    source источник
comment
Можете ли вы опубликовать структуру вашей таблицы?   -  person Iswanto San    schedule 02.03.2013
comment
Может, расскажете, о какой системе вы говорите?   -  person deceze♦    schedule 02.03.2013
comment
@deceze: судя по использованию sysdate, он, вероятно, использует Oracle.   -  person a_horse_with_no_name    schedule 02.03.2013
comment
Я согласен с @a_horse_with_no_name, я думаю, что это база данных оракула. Это использование MONTH_BETWEEN и SYSDATE   -  person Iswanto San    schedule 02.03.2013
comment
Затем кто-то должен пометить его соответствующим образом, предпочтительно сам ОП.   -  person deceze♦    schedule 02.03.2013
comment
Нам нужно было бы увидеть определение таблицы и полное ограничение проверки, чтобы обнаружить немедленную ошибку. Но это все равно не сработает, как объяснил Майк в своем ответе. См. этот вопрос для получения дополнительной информации по этой теме.   -  person Alex Poole    schedule 02.03.2013


Ответы (2)


В Oracle вы не можете ссылаться на системную переменную в ограничении CHECK. На самом деле, я был бы немного удивлен, если бы любая СУБД SQL позволяла это, потому что это делает ограничение неопределенным.

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

  • Используйте триггер.
  • Используйте ссылку внешнего ключа на таблицу дат, которые по крайней мере за 18 лет до сегодняшнего дня. Вам понадобится задание, которое вставляет строку каждый день. Однако часовые пояса могут доставить вам небольшие проблемы.
  • Сохраните тот факт, что пользователь утверждает, что ему исполнилось 18 лет.

Ограничения CHECK

person Mike Sherrill 'Cat Recall'    schedule 02.03.2013

В документации Oracle четко указано, что для проверочных ограничений разрешены только детерминированные функции; sysdate, systimestamp и т. д. явно запрещены. Подробнее.

Одним из распространенных способов обойти это ограничение является использование модели данных. Например, есть ли в вашей таблице USERS REGISTRATION_DATE? Что-то подобное обязательно должно быть. Естественно REGISTRATION_DATE по умолчанию будет sysdate и, вот! ваше ограничение становится законным:

(FLOOR((MONTHS_BETWEEN(REGISTRATION_DATE, DOB))/12))>=18

Кстати, обратите внимание, что порядок аргументов для MONTHS_BETWEEN() таков (более поздняя_дата, более ранняя дата). Проверьте.

person APC    schedule 03.03.2013