在Oracle中执行触发器以将旧值复制到镜像表

在Oracle中执行触发器以将旧值复制到镜像表,oracle,triggers,Oracle,Triggers,我们试图在删除/更新之前使用触发器将表的当前行复制到镜像表。下面是工作查询 BEFORE UPDATE OR DELETE ON CurrentTable FOR EACH ROW BEGIN INSERT INTO MirrorTable ( EMPFIRSTNAME, EMPLASTNAME, CELLNO, SALARY ) VALUES ( :old.EMPFIRSTNAME, :old.EMPLASTNAME, :old

我们试图在删除/更新之前使用触发器将表的当前行复制到镜像表。下面是工作查询

 BEFORE UPDATE OR DELETE 
  ON CurrentTable FOR EACH ROW
  BEGIN
      INSERT INTO MirrorTable
 ( EMPFIRSTNAME,
   EMPLASTNAME,
   CELLNO,
   SALARY
    )
VALUES
 ( :old.EMPFIRSTNAME,
   :old.EMPLASTNAME,
   :old.CELLNO,
   :old.SALARY
    ); 
END;
但问题是我们在当前表中有50多个coulmn,不想提及所有这些列名。有没有办法选择像这样的所有coulmn :旧的*

任何建议都会有帮助


谢谢,

事实上,没有。您需要列出所有列

  • 当然,您可以通过从
    DBA\u TAB\u列中提取列名来动态生成触发器代码。但这比简单地输入50个列名要多得多
  • 如果您的表恰好是一个对象表,
    :new
    将是该对象的一个实例,因此您可以插入该对象。但拥有对象表是相当罕见的

如果您的“当前”和“镜像”表具有完全相同的结构,您可以使用

INSERT INTO MirrorTable
  SELECT *
    FROM CurrentTable
    WHERE CurrentTable.primary_key_column = :old.primary_key_column
老实说,我认为这是一个糟糕的选择,不会这样做,但这是一个或多或少自由的世界,你可以自由(或多或少:-)做出自己的选择


分享和享受。

出于自身的价值,我一直在写同样的东西,并用它来生成代码:

SQL>设置页面大小0
SQL>选择“:old.”| | COLUMN| | | COLUMN|NAME |“,”从table|NAME='BIGTABLE'和owner='BOB'所在的所有|tab|列中;
:old.COL1,
:old.COL2,
:old.COL3,
:old.COL4,
:old.COL5,

如果输入所有列,则无需重复提及它们(空列可以使用NULL):

插入到bigtable值中(
:old.COL1,
:old.COL2,
:old.COL3,
:old.COL4,
:old.COL5,
空,
无效)


写那么多栏的桌子的人不应该吃甜点;-)

通常,如果在
CurrentTable
上定义的行级触发器中查询
CurrentTable
,通常会得到一个变异表错误。例外情况是,如果每次插入都始终是带有
插入的单行插入。。。值
但这并不特别现实。@JustinCave:doh!忘了我们说的是CurrentTable上的触发器。在这种情况下,我建议使用复合触发器。如果您使用具有列编辑模式的编辑器,这将对您的编码有很大的帮助。例如,Ultraedit和sublime Text可以非常轻松地复制一长列名称(名称1名称2等),然后将其编辑到另一列条目中,例如“Coalesce(总和(名称1),0)总和(名称01)”。它会加快你的速度,消除打字错误。
INSERT INTO MirrorTable
  SELECT *
    FROM CurrentTable
    WHERE CurrentTable.primary_key_column = :old.primary_key_column