как создать триггер, чтобы нельзя было вставлять дату раньше 2017 года и позже 2019 года - PullRequest
1 голос
/ 16 января 2020
Create or replace Trigger in_vehicle
Before Insert of PURCHASE_DATE On Vehicle 
for each row
Begin
IF(:new.PURCHASE_DATE < '12/31/2016')
THEN
raise_application_error(20001, 'the Hire date must be between 2017 and 2020');
end if 
if(:new.PURCHASE_DATE > '12/31/2016') and  (:new.PURCHASE_DATE > '01/01/2020')
then raise_application_error(20001, 'the Hire date must be between 2017 and 2020');
end if;
end;

ORA-04073: список столбцов недопустим для этого типа триггера

Ответы [ 4 ]

2 голосов
/ 16 января 2020

Во-первых, не нужно указывать имя столбца в объявлении триггера, просто имя таблицы идет сюда

Before insert on table_name

Во-вторых, если мне кажется, что избыточны, я просто скажу "меньше" чем или больше чем ".

В-третьих, номера исключений всегда (насколько я знаю) отрицательны. «-20001» в вашем случае. Вот пример триггера, который вам, вероятно, понадобится

CREATE OR REPLACE Trigger in_vehicle
Before Insert On qq
for each row
Begin
  IF(:new.PURCHASE_DATE < to_date('12/31/2016', 'mm/dd/yyyy')) or (:new.PURCHASE_DATE > to_date('01/01/2020', 'mm/dd/yyyy')) THEN
    raise_application_error(-20001, 'the Hire date must be between 2017 and 2020');
  end if;
end;

С другой стороны, такое ограничение может быть реализовано намного проще с помощью проверочного ограничения для таблицы. Вот так

alter table your_table add constraint purchase_date_2017_2019 check (purchase_date between to_date('01.01.2017', 'dd.mm.yyyy') and to_date('31.12.2019', 'dd.mm.yyyy'));   

Недостатком здесь является то, что исключение будет выглядеть как "Ограничение покупки_дата_2017_2019 нарушено". Не требует пояснений и потребностей и дополнительной обработки, чтобы отправить четкое сообщение пользователю

Надеюсь, это поможет

0 голосов
/ 24 января 2020

Прежде всего, я не вижу причин, по которым вы используете trigger для проверки даты? Если вы получаете значение даты из oracle-apex page-item (простите, но вы добавили oracle-apex в качестве tag), вы можете просто создать date field/item и просто предоставить значения min-date и max-date. Это ограничит пользователей, чтобы выбрать дату в данный период времени. Вы также можете создать validation в oracle-apex.

Другое дело, в вашем коде много ошибок, как если бы вы сравнивали поле даты со строкой, используя to_date(). Функция ошибки должна выбрасывать отрицательное число, например -20001.

0 голосов
/ 16 января 2020

Этот триггер сработал. :)

CREATE OR REPLACE Trigger in_vehicle
Before Insert On qq
for each row
Begin
  IF(:new.PURCHASE_DATE < to_date('12/31/2016', 'mm/dd/yyyy')) or (:new.PURCHASE_DATE > to_date('01/01/2020', 'mm/dd/yyyy')) THEN
    raise_application_error(-20001, 'the Hire date must be between 2017 and 2020');
  end if;
end;

0 голосов
/ 16 января 2020

До (и после) триггеры вставки не берут список столбцов (как это делают триггеры до и после обновления), поскольку вы всегда вставляете всю строку, независимо от того, есть ли в ней какой-либо из столбцов null.

Просто удалите предложение of, и все будет в порядке:

Create or replace Trigger in_vehicle
Before Insert On Vehicle -- Of clause removed
for each row
-- etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...