2

ADO.net から Oracle を呼び出す場合、ループ内で複数の挿入を呼び出す場合、各挿入により、その PL-Sql 内に Commit ステートメントを含むトリガーが起動されるため、そのコミットを停止することは不可能であると誰かから言われました。実際にトランザクションをコミットします。

つまり、ループの開始前に ADO.Net コードでトランザクションを開始し、ループの終了時に、ループ内のすべての挿入が成功した場合にのみ、すべての挿入をコミットするようにします。私の情報筋によると、オラクルの仕組みでは、これらのトリガーに COMmit ステートメントが含まれている場合、これは不可能です..

これは非常に一般的な要件のようであり、SQL Server で可能であることはわかっているため、私には適切ではないように思えます。

これは正しいです?

4

1 に答える 1

6

彼がOracleデータベースのトリガーについて話している場合、あなたの情報提供者は間違っています:

1)自律的でない Oracle トリガーに COMMIT を配置することはできません。

SQL> create trigger this_wont_work
  2  after insert on emp
  3  begin
  4    commit;
  5  end;
  6  /

Trigger created.

SQL> insert into emp (empno) values (123)
  2  /
insert into emp (empno) values (123)
            *
ERROR at line 1:
ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "TONY.THIS_WONT_WORK", line 2
ORA-04088: error during execution of trigger 'TONY.THIS_WONT_WORK'

2) トリガーが自律的である場合 (つまり、宣言セクションに PRAGMA AUTONOMOUS_TRANSACTION がある場合)、それ (トリガー) が行った変更のみをコミットできます。

トリガーの外部で行った作業をトリガーがコミットする危険はまったくありません。

注: トリガーでの自律型トランザクションの使用は、特定の場合を除いて危険です。自律型トリガーによって実行されるアクションは、トリガーを実行するステートメントがロールバックされてもコミットされるためです。これを誤って使用すると、データが破損する可能性があります。

于 2008-11-06T17:52:16.733 に答える