2009-05-12 9 views
1

Adodbを使用してOracle表(顧客データベース)にデータを挿入するアプリケーションがあります。ADODBの使用中にOracleトリガーエラーがキャプチャされない

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

これまでのところ今までのところすべての問題は解決しました。

しかし、最近、私たちは多くの時間データがOracle表に挿入されていないことを発見しました。

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

私の問題は

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

エラーはADODB

  • で提起されていないのはなぜ

    1. のために必要なヘルプは、私はあなたが問題
    2. を解決するために提案することができ
    3. 何を上げる任意のエラーを実装するために顧客に通知する必要がありますか

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

  • 答えて

    0

    私はadodbを使ったことが一度もありませんでした(ADO.NETではなく、あなたが使っているものと仮定しています)。しかし、その参考文献を簡単に見てみましょう。実際にはクエリの戻り状態を確認していますか? ?

    $ok = $DB->Execute("update atable set aval = 0"); 
    if (!$ok) mylogerr($DB->ErrorMsg()); 
    
    +0

    ログに記録されたストアドプロシージャを呼び出す必要があります。エラーメッセージは返されず、したがって正常に実行されたことを示します –

    +0

    hrmm、非常に奇妙です。エラーがトリガーであることを実際に例外を起こしていることを確認できますか? adodbセッションのセッショントレースをオンにして、トレースファイルを確認します。 クエリを手動で実行するときに発生するエラーは何ですか? これを複製して共有できるテストケースを修得できますか? –

    1

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

    "Oracleテーブルに挿入するときにエラーが発生しないため、ログに記録したりアクションを取ることができません。 挿入時にエラーが発生していない場合は、コミット時にエラーが発生することがあります。遅延制約とマテリアライズド・ビューでこれを実現できます。

    偽的に、私は次のようにあなたの経験を再現することができました: 1。最初に延期可能な遅延可能な制約(例:val_a> 10)を持つテーブルtab_aを作成します。 2. ADOセッションは制約に違反する行を挿入しますが、制約が延期されているためエラーになりません 3.コミットが発生し、トランザクションはコミットされるのではなくロールバックされます。

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

    また、トランザクションの後に何か他のものがあり、トランザクション全体のロールバック(デッドロックなど)が発生する可能性があります。セッションのトレースは良いでしょう。その失敗、(それはロールバックされませんので、ファイル内など)

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

    1
    1. あなたはログテーブルにビジネスロジックを記録することができ、エラーをログに記録するようにユーザーにSERVERERRORトリガーに見えます。
    2. ただし、ストアドプロシージャを使用してメッセージを記録する必要があります。
    3. ストアドプロシージャには、ログデータをログテーブルに保存する必要があるようなトランザクションのプラグマが必要です。
    4. あなたはトリガーがエラーハンドリングを持っている必要があります - とエラー処理で、[はい(プラグマのトランザクションを持っている)
    関連する問題