我想知道如果在我的oracle数据库正在使用时更换触发器,我是否会遗漏任何数据.我创造了一个玩具示例,似乎我不会,但我的一位同事声称不然.
create table test_trigger (id number);
create table test_trigger_h (id number);
create sequence test_trigger_seq;
--/
create or replace trigger test_trigger_t after insert on test_trigger for each row
begin
insert into test_trigger_h (id) values (:new.id);
end;
/
--/
begin
for i in 1..100000 loop
insert into test_trigger (id) values (test_trigger_seq.nextval);
end loop;
end;
/
--/
begin
for i in 1..10000 loop
execute immediate 'create or replace trigger test_trigger_t after insert on test_trigger for each row begin insert into test_trigger_h (id) values (:new.id); end;';
end loop;
end;
/
ran the two loops at the same time
select count(1) from test_trigger;
COUNT(1)
100000
select count(1) from test_trigger_h;
COUNT(1)
100000
Run Code Online (Sandbox Code Playgroud)
我认为您可能会以错误的方式进行测试。您的插入语句根本不会花费任何时间,因此触发器的替换可以适应插入之间的间隙。至少这是我根据以下内容推断的。
如果您更改测试以确保您有一个长时间运行的 SQL 语句,例如
create table test_trigger (id number);
create table test_trigger_h (id number);
create sequence test_trigger_seq;
create or replace trigger test_trigger_t
after insert on test_trigger for each row
begin
insert into test_trigger_h (id) values (:new.id);
end;
/
insert into test_trigger
select level
from dual
connect by level <= 1000000;
Run Code Online (Sandbox Code Playgroud)
如果您随后尝试在单独的会话中替换触发器,则直到插入完成后才会发生。
不幸的是,我在文档中找不到任何支持我的内容;这只是我所知道的行为。