-1

テーブル STUD と ROW レベルの TRIGGER が INSERT クエリに実装されていると考えてみましょう。最終的に結果を出力する必要があります。それで、これは可能ですか?はいの場合、これは動的な形式で存在する必要があります。つまり、スクリプトファイルの内容を変更すると、オラクルもそれらの変更を反映する必要があります。

外部プロシージャを使用してJavaでこれを実行しようとしましたが、望んでいた結果にあまり満足していません。

この種のシナリオとこれを実装する方法について、あなたの見解を教えてください。

4

2 に答える 2

4

これが悪い考えである理由のコミュニティ wiki。

動的コードにファイルを使用することがばかげている理由。

  1. 挿入される各行は、ファイルを開き、内容全体を読み取り、それを解析し、その結果に対して「何かを実行」する必要があります。それは遅くなるでしょう。

  2. OSの環境によっては、ファイルの読み書きを同時に開くことができない場合があります。そのため、コードの変更をファイルに「プロモート」するためにデータベースをシャットダウンする必要がある場合があります。

  3. OS 環境によっては、一度に 1 つのセッションしかファイルから読み取ることができない場合もあります。

  4. おそらく、トリガーは「保存」の途中でファイルを読み取り、部分的なコードを実行します。

  5. ファイルのセキュリティはデータベースのセキュリティから完全に分離されるため、メンテナンスの頭痛の種になります。

つまり、動的コードをファイルではなくテーブルに保存すると、大幅な改善が得られます。

とにかく動的コードを使用すべきではない理由:

  1. 動的コードは解析/コンパイルされていません。そのため、機能しない可能性があり、実行されるまでわかりません。

  2. 静的コードは、構文解析のオーバーヘッドが少ないため、動的コードよりも優れたパフォーマンスを発揮します。

その他 理由

  1. 行レベルのトリガーがコードを読み取って実行するということは、テーブルに複数のレコードを挿入する同じステートメントが、さまざまな行の挿入に対して実行するさまざまなバージョンのコードを取得する可能性があることを意味します。
于 2010-05-19T04:51:08.450 に答える
1

OS の処理を​​行っている sh ファイルにアクセスしたい場合はどうすればよいでしょうか。

データベース内から OS を実行するには 3 つの方法があります。

  1. CまたはJavaで記述されたOSライブラリへのPL/SQLラッパーである外部プロシージャ。Oracle 8.0 以降で使用できます。 詳細をご覧ください

  2. hostコマンドをエミュレートする Java ストアド プロシージャ。これは Java の手巻きラッパーですRuntime。このコマンドは、oracleOS ユーザーの強力な権限で実行されるため、この手順を一般的な用途に公開しないでください。代わりに、安全なユーザーに所有させ、ストアド プロシージャを記述して、OS 機能の特定の部分 (たとえば、実行するプロシージャ、実行するmkdir関数ls) を公開します。Oracle 8i 以降で可能です。 詳細をご覧ください

  3. DBMS_SCHEDULER。バックグラウンド データベース ジョブと同様に、スケジュールされた を使用して OS ジョブを実行できます。Oracle 10g 以降で使用できます。 詳細を見る

これら 3 つのオプションのうち、DBMS_SCHEDULER がおそらく最も安全なオプションです。その名前が示すように、時間に基づいてプログラムを実行することを目的としているcronため ( unix など)、オンデマンドで実行する (たとえば、トリガーを介して) には適していません。ただし、トリガーがなくてもビジネス ロジックを満たすことができる場合があります。外部プロシージャは、シェル スクリプトを実行するためのものではありません。

外部プログラムは外部であるため、データベース コンポーネントとの調整にはより多くの労力が必要です。これは、アプリケーションの新しいバージョンをリリースし、バックアップを行うときに適用されます。また、(たとえば) 開発環境とライブ環境が異なるプラットフォーム上にある場合にも問題になる可能性があります。

データベースに任意のコードを実行させるのは非常に悪い考えです。ほとんどのシナリオで必要なのは、パラメーターを実行可能ファイルに渡すためのメカニズムだけです。

于 2010-05-19T06:43:11.207 に答える