2013-03-02 4 views
-1

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

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

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

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

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

Thanx!

+1

Можете ли вы опубликовать свою структуру таблицы? –

+0

Возможно, расскажите, о какой системе вы говорите? – deceze

+0

@deceze: судя по использованию 'sysdate', что он, вероятно, использует Oracle. –

ответ

4

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

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

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

Restrictions on CHECK constraints

1

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

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

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

Кстати, обратите внимание, что порядок аргументов MONTHS_BETWEEN() является (later_date, более ранняя дата). Check it out.