【问题标题】:two triggers on one table一张桌子上有两个触发器
【发布时间】:2015-05-21 13:27:47
【问题描述】:

我对 oracle 数据库非常陌生,我的办公室使用的是 oracle 10g。我的问题是 我有两张表,一张是 current_cases,列有 case_id、col1、col2 col3 ..... 另一张表 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 中。请给一些关于这个小问题的想法.....

【问题讨论】:

  • 这在一定程度上取决于现有触发器正在做什么。您能否将表和现有触发器的 DDL 添加到问题中,并包含一些示例数据、示例更新语句以及触发器触发后您希望看到的情况?
  • 在更新 current_cases 之前我想将较早的数据存储到 backup_cases 但 backup_cases 表有触发器在列 id 1 处插入下一个值作为 backup_id 然后如何使用触发器将当前案例数据插入 backup_cases , 将插入到 backup_cases select * from current_cases 是否有效。

标签: oracle plsql


【解决方案1】:

...backup_cases 上的 nextval 触发器会自动填充吗?

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 

【讨论】:

    【解决方案2】:

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

    如果您在当前表上添加更新触发器,它可以将 NEW 行写入备份表,并且一切都应该正常工作。您无需对任一表上的任何现有触发器进行任何更改。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2019-08-29
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多