【问题标题】:ORACLE Trigger INSERT On UPDATEORACLE 在更新时触发 INSERT
【发布时间】:2011-07-07 13:11:36
【问题描述】:

所有, 我只是想创建一个触发器,它将从 TABLE EMP 中选择一条完整的记录,并在 UPDATE 尝试时将其插入到 TABLE 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;

【问题讨论】:

  • 您的语法错误是 Select 需要括号括起来。不过,a_horse_with_no_name 提供了正确的答案。您根本不需要 SELECT。
  • 包含实际的错误消息(ORA-xxxxx 错误号以及错误文本)通常会有所帮助。有时错误会在没有它的情况下跳出来,但有时错误是非常有用的信息。

标签: oracle triggers


【解决方案1】:

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

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;

其他人。

【讨论】:

    【解决方案2】:

    无需从表格中选择:

    创建或替换触发器 Save_EMP_Changes 在更新 EMP 之前 每一行 开始 插入 EMP_ARCHIVE ( emp_id,emp_name, emp_age, emp_sex, emp_active ) 价值观 ( :old.emp_id, :old.emp_name, :old.emp_age, :old.emp_sex, :old.emp_active ); 结尾;

    顺便说一句:在 Oracle 11 中,您可以通过为这些表创建一个 FLASHBACK ARCHIVE 来完全自动化此操作。没有触发器或任何其他麻烦。

    【讨论】:

    • 在 11g 之前,Workspace Manager 还可用于自动跟踪历史信息。
    • @Justin:是的,但是查询信息没那么容易。使用闪回存档,您可以执行SELECT * FROM some_table AS OF TIMESTAMP TIMESTAMP '2005-06-28 14:38:12'
    • 您是否在 INSERT 后添加了分号?你用哪个工具运行这个?在 SQLPlus 中,您需要在一行中使用 / 来终止它。复制和粘贴(作为问题的编辑)你在 SQL*Plus 中所做的事情可能是一个好主意,以防你使用它。
    • @a_horse_with_no_name:一个简短的子问题。使用上述代码创建的触发器在 EMP_ARCHIVE 表中插入两条记录,我只想插入旧记录。你明白我的意思了吗?
    • @Dine:那个触发器只会插入一行。但这将发生在您所做的每一次更新中。因此,如果您更新 emp 两次,您将在 emp_archive 中得到两行。
    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多