一个 table 上的两个触发器

two triggers on one table

我是 oracle 数据库的新手,我的办公室使用的是 oracle 10g。我的问题是 我有两个 table,一个是 current_cases,列为 case_id、col1、col2、col3..... 另一个 table backup_cases 有 backup_id, case_id, col1,col2,col3... 其中 current_cases 的 case_id 与 backup_cases

的 case_id 相同

我想在更新 current_cases 之前创建一个触发器以将所有行的数据插入 backup_cases,但是 backup_cases 上已经有一个触发器来插入 backup_sequence 下一个值。那么如何创建更新触发器,backup_cases 上的 nextval 触发器会自动填充,还是我应该越过 sequence.next val 插入 backup_cases。请对这个小问题给出一些想法.....

...will the nextval trigger on backup_cases will automatically fill?

backup_cases 上的触发器会起作用,但您必须明确列出所有插入的值,而不是这样:insert ... select * ....

测试:(一切都已简化,没有主键、索引、外键、约束,只是为了以简短易读的方式解决您的问题):

-- tables creation
create table current_cases (case_id number, col1 varchar2(20), 
  col2 varchar2(20));
create table backup_cases (backup_id number, case_id number, col1 varchar2(20), 
  col2 varchar2(20));

-- sequences creation
create sequence cc_seq;
create sequence bc_seq;

-- triggers
create or replace trigger bc_trg before insert on backup_cases
for each row
begin
  select bc_seq.nextval into :new.backup_id from dual;
end;

create or replace trigger cc_trg before insert or update on current_cases
for each row
begin
  if inserting then 
    select cc_seq.nextval into :new.case_id from dual;
  else
    insert into backup_cases (case_id, col1, col2)
      values (:old.case_id, :old.col1, :old.col2);
  end if;
end;

-- inserts and update sample data
insert into current_cases (col1, col2) values ('a1', 'a1');
insert into current_cases (col1, col2) values ('b1', 'b1');
insert into current_cases (col1, col2) values ('c1', 'c1');
update current_cases set col1 = 'b2a', col2='b2b' where case_id=2;

结果:

select * from current_cases;

   CASE_ID COL1                 COL2               
---------- -------------------- --------------------
         1 a1                   a1                   
         2 b2a                  b2b                  
         3 c1                   c1                   

select * from backup_cases;

 BACKUP_ID    CASE_ID COL1                 COL2               
---------- ---------- -------------------- --------------------
         1          2 b1                   b1 

看起来你没有什么可担心的。我假设备份 table 上有一个插入触发器来生成备份 ID。我还假设当前 table 上有一个插入触发器,用于将传入行也插入备份 table。它也可能正在生成当前 ID。

如果您在当前 table 上添加一个更新触发器,它可以将新行写入备份 table,一切都应该正常进行。您无需对 table.

上的任何现有触发器进行任何更改

如果您有任何疑问,这是一个非常容易测试的操作。