1

Adodbを使用してOracleテーブル(顧客データベース)にデータを挿入するアプリケーションがあります。

  1. エラーがなければ、データは正常に挿入されています。
  2. 無効なデータ型などのエラーが発生した場合、アプリケーションによってエラーが発生してキャプチャされ、ログ ファイルにダンプされます。
  3. 私の顧客は、この特定のテーブルに独自のトリガーを作成しました。レコードが挿入されると、データ挿入の前に他のいくつかのチェックが行われます

今までは大丈夫です。

しかし最近、Oracle テーブルにデータが挿入されないことが何度もあることがわかりました。

  1. ログ ファイルをチェックインしたところ、エラーは見つかりませんでした。
  2. 次に、実行されたクエリをログに記録しました。
  3. クエリをOracle Sqlプロンプトにコピーして実行すると、トリガーのエラーが発生しました。

私の問題は

  1. お客様はトリガーの詳細を共有する準備ができていません。
  2. Oracle テーブルへの挿入中にエラーが発生しないため、ログに記録したり、アクションを実行したりできません。
  3. Oracleで直接実行すると同じqryがトリガーエラーとして表示されます。

助けが必要

  1. ADODB でエラーが発生しない理由
  2. エラー発生を実装するよう顧客に通知する必要がありますか?
  3. 問題を解決するために提案できること

私は Oracle について 0% から 10% の知識を持っています。

4

3 に答える 3

1
  1. ビジネスロジックをログテーブルに記録できます。
  2. ただし、メッセージをログに記録するには、ストアドプロシージャを使用する必要があります。
  3. ストアドプロシージャには、ログデータをログテーブルに保存する必要があるプラグマトランザクションが必要です。
  4. トリガーにはエラー処理が必要です。エラー処理では、Loggedストアドプロシージャ(プラグマトランザクションがあります)を呼び出す必要があります。
于 2012-07-11T09:49:15.410 に答える
1

「クエリをOracle Sqlプロンプトにコピーして実行すると、トリガーのエラーが発生しました。」ADO セッションはエラーを報告しないため、トリガーからのエラーが誤解を招く可能性があります。それは単に、「ねえ、アプリケーション以外でこのテーブルに挿入することは許可されていません」という行のチェックかもしれません.

「Oracle テーブルへの挿入中にエラーが発生しないため、ログに記録したり、アクションを実行したりできません。」挿入時にエラーが発生しない場合は、コミット時に発生する可能性があります。遅延制約と具体化されたビューがこれを与える可能性があります。

仮説として、私はあなたの経験を次のように再現できます: 1. 最初に延期された延期可能な制約 (例: val_a > 10) を持つテーブル tab_a を作成します。 3. コミットが発生し、制約違反の例外が発生し、トランザクションはコミットされずにロールバックされます。

したがって、コミットでエラーが発生する可能性に対応しているかどうかを確認してください。

また、トランザクション全体のロールバックにつながる、トランザクションの後半の何か (デッドロックなど) である可能性もあります。セッションの追跡は良いでしょう。それに失敗した場合は、ユーザーの SERVERERROR トリガーを調べて、エラーをログに記録します (たとえば、ファイルに記録されるため、ロールバックされません)。

http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#i2153530

于 2009-05-12T23:02:40.927 に答える
0

私はadodbを使用したことがありません(ADO.NETではなく、あなたが使用しているものだと思いますか?)。

$ok = $DB->Execute("update atable set aval = 0");
if (!$ok) mylogerr($DB->ErrorMsg());
于 2009-05-12T12:29:16.620 に答える