Проверка ограничений не может вызывать недетерминированные функции, такие как CURRENT_DATE . Предполагается, что проверочные ограничения всегда выполняются, могут возникнуть странные вещи, если проверочные ограничения устареют.
В приведенном ниже примере кода показана одна из ошибок, которые вы можете получить, пытаясь использовать CURRENT_DATE
в проверочном ограничении:
SQL> create table test1(a date);
Table created.
SQL> alter table test1 add constraint test1_ck1 check(a > date '2000-01-01');
Table altered.
SQL> alter table test1 add constraint test1_ck2 check(a > current_date);
alter table test1 add constraint test1_ck2 check(a > current_date)
*
ERROR at line 1:
ORA-02436: date or system variable wrongly specified in CHECK constraint
Создайте триггер, чтобы обойти эту проблему:
create or replace trigger test1_date_gt_today
before update or insert of a on test1
for each row
begin
if :new.a is null or :new.a < current_date then
raise_application_error(-20000, 'The date cannot be earlier than today.');
end if;
end;
/
Ниже приведен пример работы одной INSERT, и одна не соответствует условию в триггере:
SQL> insert into test1 values(sysdate + 1);
1 row created.
SQL> insert into test1 values(sysdate - 1);
insert into test1 values(sysdate - 1)
*
ERROR at line 1:
ORA-20000: The date cannot be earlier than today.
ORA-06512: at "JHELLER.TEST1_DATE_GT_TODAY", line 3
ORA-04088: error during execution of trigger 'JHELLER.TEST1_DATE_GT_TODAY'