触发插入旧值

时间:2012-05-27 12:23:30

标签: database oracle oracle10g database-trigger

我的桌面上有以下触发器,我面临的问题是在my_hist表中,当条件变为updated = 'Y'时,新旧值都会被插入。

当条件变为updated = 'Y'时,如何有效地将旧值插入my_hist表中。

由于

CREATE OR REPLACE TRIGGER mytrig
    AFTER UPDATE
    ON mytab
    FOR EACH ROW
WHEN (
new.updated = 'Y'
      )
BEGIN
    INSERT INTO my_hist
      VALUES   (
                        :old.id,
                        :old.no,                        
                        :old.start_date,
                        :old.end_date,
                        SYSDATE
                  );
END mytrig;
/

更新1

如果我正在更新updated = 'Y',那么我是否有记录

id = 3,start_date = '01 -Jan-2014'和end_date = '31 -Jan-2014'并更新数据 id = 3, start_date=='01-Jan-2014' and end_date='31-Mar-2014'然后我将在my_hist表中有两条记录

id = 3 and start_date='01-Jan-2014' and end_date='31-Jan-2014'

id = 3 and start_date='01-Jan-2014' and end_date='31-Mar-2014'

理想情况下,my_hist表中应该只有id = 3 and start_date='01-Jan-2014' and end_date='31-Jan-2014',而不是end_date='31-Mar-2014'的第二行,因为这是新数据。

1 个答案:

答案 0 :(得分:2)

您的描述中缺少某些内容。如果你按照你说的那样做,你的历史表只有一行,而且它会有旧数据。如果您还有一个包含新数据的历史记录行,则您的触发器正在执行除您发布的内容之外的其他操作,或者您正在写入历史记录表中的其他内容(即另一个触发器)。

创建两个表

SQL> ed
Wrote file afiedt.buf

  1  create table my_tab (
  2    id number,
  3    start_date date,
  4    end_date date,
  5    no number,
  6    updated varchar2(1)
  7* )
SQL> /

Table created.

SQL> ed
Wrote file afiedt.buf

  1  create table my_hist (
  2    id number,
  3    start_date date,
  4    end_date date,
  5    no number,
  6    updated varchar2(1),
  7    update_date date
  8* )
SQL> /

填充初始数据

SQL> ed
Wrote file afiedt.buf

  1  insert into my_tab
  2*   values( 3, date '2014-01-01', date '2014-01-31', 1, 'Y' )
SQL> /

1 row created.

创建触发器

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE TRIGGER mytrig
  2      AFTER UPDATE
  3      ON my_tab
  4      FOR EACH ROW
  5  WHEN (
  6  new.updated = 'Y'
  7        )
  8  BEGIN
  9      INSERT INTO my_hist( id,
 10                           no,
 11                           start_date,
 12                           end_date,
 13                           update_date )
 14        VALUES   (
 15                          :old.id,
 16                          :old.no,
 17                          :old.start_date,
 18                          :old.end_date,
 19                          SYSDATE
 20                    );
 21* END mytrig;
SQL> /

Trigger created.

现在,当我更新行

SQL> update my_tab
  2     set end_date = date '2014-03-31'
  3   where id = 3;

1 row updated.

MY_HIST表中只有一行,该行将包含MY_TAB

行中的旧值
SQL> select * from my_hist;

        ID START_DAT END_DATE          NO U UPDATE_DA
---------- --------- --------- ---------- - ---------
         3 01-JAN-14 31-JAN-14          1   27-MAY-12

如果您看到两行,则其他内容正在写入第二行。我的猜测是你定义了另一个触发器。