在Oracle中执行触发器,用于将旧值复制到Mirror表

时间:2012-04-18 18:10:13

标签: 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.CELLNO,
   :old.SALARY
    ); 
END;

但问题是我们在当前表中有超过50个coulmns,并且不想提及所有这些列名。有没有办法选择像所有的coulmns  :老*

SELECT  * INTO MirrorTable FROM CurrentTable

任何建议都会有所帮助。

谢谢,

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

的内容
INSERT INTO MirrorTable
  SELECT *
    FROM CurrentTable
    WHERE CurrentTable.primary_key_column = :old.primary_key_column

老实说,我认为这是一个糟糕的选择,不会这样做,但它是一个或多或少的自由世界,你可以自由(或多或少:-)做出自己的选择。

分享并享受。

答案 2 :(得分:0)

为了它的价值,我一直在编写相同的东西并用它来生成代码:

SQL>设置pagesize 0
SQL>选择':old。'|| COLUMN_NAME ||','来自all_tab_columns,其中table_name ='BIGTABLE'和owner ='BOB';
:old.COL1,
:old.COL2,
:old.COL3,
:old.COL4,
:old.COL5,
...

如果您提供所有列,则无需提及它们两次(并且您可以对空列使用NULL):

INSERT INTO bigtable VALUES(
:old.COL1,
:old.COL2,
:old.COL3,
:old.COL4,
:old.COL5,
NULL,
NULL);

写那些有很多列的桌子的人应该没有甜点; - )