5

職場では、基本的に次の列を含む設定を保持するテーブルがあります。

  • PARAMNAME
  • VALUE

ほとんどの場合、新しい設定が追加されますが、まれに設定が削除されることがあります。残念ながら、これは、以前にこの値を更新した可能性のあるスクリプトは、更新の結果が " 0 rows updated" になり、予期しない動作につながるにもかかわらず、引き続き更新することを意味します。

この状況は、回帰テストの失敗によって最近発見されましたが、システム内のデータが異なる理由を十分に調査した結果です。

私の質問は次のとおりです。更新の結果、ゼロ行が更新されたときにエラー状態を生成する方法はありますか?

ここに私が考えたいくつかのオプションがありますが、どれも実際にはそれほど望ましいものではありません:

  • 失敗した更新を通知して例外をスローする PL/SQL ラッパー。
    • 誰も/スクリプトが手動で更新を行うのを止めないため、理想的ではありません。
  • 例外をスローするテーブルのトリガー。
    • トリガーを段階的に廃止するという現在のポリシーに反します。
    • 設定が削除されるたびにトリガーを更新し、廃止された設定のリストを維持する必要があります (除外を行う場合)。
    • テーブルの変更に問題がある可能性があります (現在存在する設定を照会して含める場合)。
4

3 に答える 3

3

PL/SQLラッパーは私にとって最良のオプションのようです。トリガーは、シーケンスの生成と履歴レコードの挿入を除いて、段階的に廃止するのに最適です。

PL / SQLラッパーを使用せずに手動で更新する人が心配な場合は、ユーザーロールを制限して、テーブルに対するUPDATE権限は持たないが、プロシージャに対するEXECUTE権限を持つようにします。

于 2012-04-16T23:09:27.620 に答える
1

MERGEステートメントを使用できるかもしれません ここにリンクがあります

http://www.oracle-developer.net/display.php?id=203

merge ステートメントを使用すると、同じクエリで挿入と更新を組み合わせることができるため、目的の行が存在しない場合は、行が存在しないことを示すためにバッファー テーブルにレコードを挿入するか、必要なレコードを更新することができます。

それが役に立てば幸い

于 2012-04-17T03:44:41.883 に答える
1

実際には解決策ではありませんが、物事を少し整理する方法:

パラメータ定義を含む別のテーブルを作成し、パラメータ値テーブルからそのテーブルにリンクします。必要なパラメーター定義への参照を作成します (null は許可されません)。

定義表PARAMS (ID, NAME)

実際の設定表 PARAM_VALUES (PARAM_ID, VALUE)

(テーブル構造を変更することは、更新されていないスクリプトでエラーを引き起こす非常に効果的な方法でもあります...)

于 2012-04-16T22:46:46.957 に答える