我的桌面上有以下触发器,我面临的问题是在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'
的第二行,因为这是新数据。
答案 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
如果您看到两行,则其他内容正在写入第二行。我的猜测是你定义了另一个触发器。