一个 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.
上的任何现有触发器进行任何更改
如果您有任何疑问,这是一个非常容易测试的操作。
我是 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.
上的任何现有触发器进行任何更改如果您有任何疑问,这是一个非常容易测试的操作。