drno-reg
@drno-reg
см не кратко

Как правильно решить проблему ORA-38104 с trigger AFTER INSERT or UPDATE with merge?

Здравствуйте.

для решения задачи потребовалось создать триггер, который бы следил за операциями AFTER INSERT or UPDATE.

/*таблица за которой будет следить триггер
*/
create table ALL_EVENTS
(
ID varchar2(255),
LAST_USER varchar2(100),
VALUE number,
TIME_RECIEVED timestamp
)
;

/*таблица лог слежения*/
-- Create table
create table ALL_EVENTS_LOG
(
  id            VARCHAR2(255),
/*  type          VARCHAR2(50),*/
  time_received TIMESTAMP(6)
)
;

/*триггер, c merge не генерит дубль если в логе уже есть информация об ID */

CREATE OR REPLACE TRIGGER ALL_EVENTS_LOG
  AFTER INSERT or UPDATE ON ALL_EVENTS
FOR EACH ROW
declare
  -- local variables here
begin
merge into ALL_EVENTS_LOG log
using DUAL on (log.id=:OLD.id)
WHEN MATCHED THEN UPDATE SET log.id=:OLD.id
  WHEN NOT MATCHED THEN INSERT (ID, TIME_RECEIVED) VALUES (:NEW.id, sysdate);
end ALL_EVENTS_LOG;


при попытке выполнить insert

insert into ALL_EVENTS values (to_char(abs(dbms_random.random)), 'user1',abs(dbms_random.random),sysdate);


возвращается исключение ORA-38104
ORA-38104: Columns referenced in the ON Clause cannot be updated: "LOG"."ID"
ORA-06512: at "ALL_EVENTS_LOG", line 4
ORA-04088: error during execution of trigger 'ALL_EVENTS_LOG'


понимаю что допускаю где-то какую-то простую ошибку...

Как правильно решить эту проблему?
  • Вопрос задан
  • 2324 просмотра
Решения вопроса 1
denman1985
@denman1985
SQL, Oracle Forms/Reports dbd
Решения с другого ресурса:
1
2
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы