全部, 我只是尝试创建一个触发器,它将从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;
答案 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其他人。