2013-08-26 6 views
6

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 
+2

興味深い。 'drop'文と' create'文を分けておけば、イベントが見逃されることが予想されます。しかし、あなたがここにいるように 'create or replace'を使用している場合はそうではありません。しかし、私はその行動が文書化されているのを見たとは思わない。 –

+0

DDL文がトランザクション処理の順次プロパティより暗黙のコミットであると仮定すると、イベントを逃すべきではありません。しかし、これが指定されていれば面白いでしょう。 – Claude

答えて

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; 

あなたは、それは挿入が完了した後まで発生しません別ののセッションでトリガーを交換しよう。

残念ながら、ドキュメンテーションで私をバックアップするためのものは見つかりませんでした。これは私が認識している動作です。

1

create or replaceがテーブルをロックしています。つまり、すべての挿入が完了するまで待機します。欠落した挿入物を心配しないでください。

0

の実行中に、トリガを変更することができます。それは "ライブラリキャッシュ"ロックであり、 "データ"ロックではありません。 Oracleはそれをあなたが気にせずに内部的に処理します。

はベンゾCan a trigger be locked; how would one determine that it is?

が提起した質問をチェックアウト - セッション2からこれを実行します。 は、オブジェクト=アッパー(「test_trigger_t」)五$アクセスから*選択します。

関連する問題