Установка столбца в новой строке с помощью триггера

У меня есть имя таблицы dblog, где схема похожа на

data_balance_id number(8) primary key,
plan_id number(6) not null,
start_date date default current_date,
end_date date not null);

Итак, я пытаюсь создать триггер, который будет обновлять столбец enddate, когда произойдет вставка. enddate будет обновляться через 30 дней со дня вставки. Мой код триггера

CREATE OR REPLACE TRIGGER trg
BEFORE INSERT
ON dblog FOR EACH ROW

BEGIN
  INSERT INTO dblog (end_date) values (SYSDATE()+30);
END;
/

Запрос на вставку выглядит следующим образом

insert into dblog (db_id, planid) values (12,123);

Триггер создается без ошибок. Но во время вставки я получаю следующую ошибку

insert into dblog (db_id, planid) values (12,123)
             *
ERROR at line 1:
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-06512: at "E1038351.TRG1", line 2

person Anirban Nag 'tintinmj'    schedule 25.09.2015    source источник
comment
Вы хотите обновить, поэтому не вставляйте еще одну строку: просто установите значение :new.end_date   -  person David Aldridge    schedule 25.09.2015
comment
Вы делаете перед вставкой и вставляете в ту же таблицу, бесконечный цикл   -  person Robert Dupuy    schedule 25.09.2015


Ответы (2)


Вы просто хотите изменить псевдозапись :new. Что-то вроде этого

CREATE OR REPLACE TRIGGER trg
  BEFORE INSERT ON dblog 
  FOR EACH ROW
BEGIN
  :new.end_date := sysdate + 30;
END;

Если вы не хотите, чтобы end_date имел компонент времени (или, скорее, вы хотите, чтобы компонент времени был в полночь), вам нужно trunc(sysdate) + 30.

person Justin Cave    schedule 25.09.2015
comment
Выдает ошибку PLS-00049: bad bind variable 'NEW.END_DATE' - person Anirban Nag 'tintinmj'; 25.09.2015
comment
@ AnirbanNag'tintinmj' - Вы уверены, что использовали префикс двоеточия? Какой клиент вы используете? Возможно, ваш клиент пытается интерпретировать что-либо с префиксом : как переменную связывания. - person Justin Cave; 25.09.2015
comment
Извините Была ошибка при наборе. Все работают нормально. - person Anirban Nag 'tintinmj'; 25.09.2015

Вы пытаетесь вставить другую строку, которая также повторно запускает триггер.

В триггерах у вас есть доступ к строке с помощью переменных :NEW и :OLD.

В случае, если вы вставляете, :OLD равно null , потому что у вас его еще нет в таблице.

Поэтому перед вставкой строки вы обновляете его столбцы следующим образом:

:NEW.END_DATE = SYSDATE+30;
person Andrei Amarfii    schedule 25.09.2015