0

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

当条件变为updated = 'Y'.

谢谢

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' and 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'

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

4

1 回答 1

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

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

于 2012-05-27T16:10:19.447 回答