如果我在应用程序运行时替换oracle触发器,是否会遗漏任何更改?

Not*_*mer 6 oracle triggers

我想知道如果在我的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)

Ben*_*Ben 0

我认为您可能会以错误的方式进行测试。您的插入语句根本不会花费任何时间,因此触发器的替换可以适应插入之间的间隙。至少这是我根据以下内容推断的。

如果您更改测试以确保您有一个长时间运行的 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)

如果您随后尝试在单独的会话中替换触发器,则直到插入完成后才会发生。

不幸的是,我在文档中找不到任何支持我的内容;这只是我所知道的行为。