ORACLE触发INSERT更新

时间:2011-03-02 19:43:57

标签: oracle triggers

全部,     我只是尝试创建一个触发器,它将从TABLE EMP中选择一个完整的记录,并在UPDATE尝试时将其插入到表EMP_ARCHIVE中(顾名思义,EMP_ARCHIVE表只是一个历史表,用于存储在邮件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 个答案:

答案 0 :(得分:6)

无需从表中选择:

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来完全自动执行此操作。没有触发器或任何其他麻烦。

答案 1 :(得分:0)

我知道这是一个有点老问题。但是我认为我为其他人提出了另一个想法,就像我刚才那样。在过去,我在执行相同的归档过程时已完成以下操作。

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其他人。