Как я могу проверить, что пользователю 12 лет и старше sql - PullRequest
1 голос
/ 11 февраля 2020

Как мне проверить, когда пользователь вводит свою дату рождения в мою базу данных, что ему 12 и более лет?

Я использую SQL plus.

Сейчас у меня есть Примерно так:

create table test(dateofbirth date not null,
 CONSTRAINT dateofbirth_ck CHECK(TO_CHAR(dateofbirth, 'YYYY-MM-DD') <= '2002-02-09')
);

Проблема в том, что он не обновляется каждый день, поэтому '2002-02-09' следует менять каждый день.

Я знаю, что делать, но я не уверен, как это выполнить. Я хочу получить 'Dateofbirth' & sysdate - 12 лет, и если пользователь старше 12 лет, он разрешит им.

1 Ответ

4 голосов
/ 11 февраля 2020

Oracle не позволите ли вы использовать sysdate в проверочном ограничении (или других функциях, чье возвращаемое значение не является постоянным во времени).

Однако вы можете написать триггер, который реализует тот же лог c:

create or replace trigger trg_mytable_dateofbirth
before insert or update on mytable
for each row
begin
    if :new.dateofbirth > add_months(sysdate, -12 * 12)
    then
        raise_application_error( -20001, 
            'invalid date of birth - current value:'
            || to_char(:new.dateofbirth, 'yyyy-mm-dd')
            || ', limit as of today:'
            || to_char(add_months(sysdate, -12 * 12), 'yyyy-mm-dd')
        );
    end if;
end;
/

Демонстрация на DB Fiddle :

insert into mytable(dateofbirth) values (date'2000-01-01')
-- 1 rows affected

insert into mytable(dateofbirth) values (date'2010-01-01')
-- ORA-20001: invalid date of birth - current value:2010-01-01, limit as of today:2008-02-10
-- ORA-06512: at "FIDDLE_MYQIVTFXTMKGROKMNOGB.TRG_MYTABLE_DATEOFBIRTH", line 4
-- ORA-04088: error during execution of trigger 'FIDDLE_MYQIVTFXTMKGROKMNOGB.TRG_MYTABLE_DATEOFBIRTH'
...