ORACLE INGERT INGERT при обновлении - PullRequest
3 голосов
/ 02 марта 2011

Все, Я просто пытаюсь создать триггер, который выберет целую запись из TABLE EMP и вставит ее в TABLE EMP_ARCHIVE при попытке UPDATE (как следует из названия, EMP_ARCHIVE Table - это просто таблица истории, в которой хранятся изменения, сделанные в почтовой таблице EMP. ). Обе таблицы имеют одинаковые поля / столбцы. Ниже приводится триггер, который я пытаюсь создать. Я знаю, что что-то не так, но не смог понять. Выдает ошибку в '(' после команды INSERT. Любая помощь будет оценена. Простите, если есть какая-то фундаментальная ошибка, так как я новичок в этом.

CREATE OR REPLACE TRIGGER Save_EMP_Changes
BEFORE UPDATE ON EMP
FOR EACH ROW
BEGIN
   INSERT INTO EMP_ARCHIVE
   (
      emp_id, emp_name,
      emp_age, emp_sex,
      emp_active
   )
   SELECT 
      :old.emp_id, :old.emp_name,
      :old.emp_age, :old.emp_sex,
      :old.emp_active
   FROM EMP 
   WHERE emp_id = :old.emp_id
END;

Ответы [ 2 ]

6 голосов
/ 02 марта 2011

Нет необходимости выбирать из таблицы:

CREATE OR REPLACE TRIGGER Save_EMP_Changes
BEFORE UPDATE ON EMP
FOR EACH ROW
BEGIN
   INSERT INTO EMP_ARCHIVE
   (
      emp_id, emp_name,
      emp_age, emp_sex,
      emp_active
   )
   VALUES
   (  :old.emp_id, :old.emp_name,
      :old.emp_age, :old.emp_sex,
      :old.emp_active
   );
END;

Кстати: в Oracle 11 вы можете полностью автоматизировать это, создав FLASHBACK ARCHIVE для этих таблиц. Нет триггера или других хлопот.

0 голосов
/ 09 апреля 2014

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

CREATE OR REPLACE TRIGGER Save_EMP_Changes
BEFORE UPDATE ON EMP
FOR EACH ROW
BEGIN
   INSERT INTO EMP_ARCHIVE
   (
      emp_id, emp_name,
      emp_age, emp_sex,
      emp_active, revision_cnt
   )
   SELECT 
      :old.emp_id, :old.emp_name,
      :old.emp_age, :old.emp_sex,
      :old.emp_active, nvl(max(revision_cnt)+1, 1)
   FROM EMP 
   WHERE emp_id = :old.emp_id
END;

HTH др.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...