6

Oracle データベースの使用中にトリガーを置き換えると、データが失われるのではないかと考えています。おもちゃの例を作成しましたが、作成しないようですが、同僚の 1 人がそうではないと主張しています。

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
4

3 に答える 3

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;

その後、別のセッションでトリガーを置き換えようとしても、挿入が完了するまで発生しません。

残念ながら、私をバックアップするドキュメントは何も見つかりません。これは私が知っている行動です。

于 2013-08-27T07:57:08.857 に答える
0

アプリケーションの実行中に変更できるトリガーとなる次の URL 回答。それは「ライブラリキャッシュ」ロックであり、「データ」ロックではありません。オラクルは、心配することなく内部的に処理します。

ベンが提起した質問を確認してください-トリガーをロックできますか。それをどのように判断しますか?

-- セッション 2 からこれを実行します。select * from v$access where object = upper('test_trigger_t');

于 2014-01-24T12:34:59.360 に答える