多くの行を持つテーブルがあります。
テスト目的で、同僚も同じテーブルを使用しています。問題は、彼が私がテストしていた行を削除していることと、私が時々削除していることです.Oracleには、
特定の行を読み取り専用にする方法がありますか?
ありがとう。
この問題に取り組むには、いくつかの異なる方法があります。
孫子が言ったように、あなたとあなたの同僚が衝突しないデータセットを使用するのが最善でしょう。
たとえば、ローカルPC上にそれぞれ独自のデータベースインスタンスを作成できます。これが適しているかどうかは、多くの要因に依存しますが、その中でも特に、Oracleとのライセンス契約があります。または、共有データベースに個別のスキーマを含めることもできます。アプリケーションによっては、同義語または特別な接続が必要になる場合があります。
別のアプローチ:誰もがテストフィクスチャと呼ばれる独自のデータセットを作成します。テストは既知の状態に対して実行された場合にのみ真に有効であるため、これは適切なポリシーです。データの有無に関する仮定を立てた場合、テスト結果はどの程度有効ですか?重要なのは、テストはそれ自体の後でクリーンアップし、フィクスチャで作成されたデータを削除し、テストを実行する必要があるということです。この戦術では、各チームメンバーのIDの範囲に同意する必要があります。チームメンバーは、テストまたは開発作業のために範囲内のレコードのみを使用する必要があります。
これらの種類のアプローチは、アプリケーションの動作方法を実際には変更しないため(おそらく、異なるスキーマとシノニムを使用する場合を除いて)、私はこの種のアプローチを好みます。より厳格な方法が利用可能です。
Enterprise Editionを使用している場合は、行レベルのセキュリティを使用してレコードを保護できます。これは最後のポイントの拡張です。レコードを識別するためのメカニズムと、セッション内の所有権を識別するためのインフラストラクチャが必要になります。ただし、他のユーザーがデータを削除するのを防ぐだけでなく、自分のIDの範囲にあるレコードを他のユーザーが挿入、更新、さらには表示するのを防ぐこともできます。 詳細をご覧ください。
より軽い解決策は、ABCadeが示唆するようにトリガーを使用することです。あなたはまだあなたの記録と誰が接続しているのかを特定する必要があります(おそらく時々あなたはまだあなたの記録を削除したいと思うでしょうから。
最後の戦略:ボールを家に持ち帰ります。必要な状態のテーブルを取得し、データポンプをエクスポートします。説得力を高めるために、この時点でテーブルを切り捨てることができます。次に、テーブルを使用するときはいつでも、データポンプインポートを実行します。これにより、テーブルの状態がリセットされ、既存のデータがすべて消去されます。これは、独自のデータを作成するテストスクリプトの極端なバージョンです。
特定の行の削除を防止するトリガーを作成できます。
CREATE OR REPLACE TRIGGER trg_dont_delete
BEFORE DELETE
ON <your_table_name>
FOR EACH ROW
BEGIN
IF :OLD.ID in (<IDs of rows you dont want to be deleted>) THEN
raise_application_error (-20001, 'Do not delete my records!!!');
END IF;
END;
もちろん、よりスマートにすることもできます。if
ステートメントを に依存さuser
せたり、別のテーブルからレコード ID を取得したりできます。
Oracle は行レベルのロックをサポートしています。あなたが使用している行を他の人が削除するのを防ぐことができます。よりよく知るために、このリンクを確認してください。