4

を含むいくつかの列を取得しROWID、後でROWID更新する必要がある行を識別するために使用するクライアント アプリケーションを見ています。

update some_table t set col1=value1
where t.rowid = :selected_rowid

そうしても安全ですか?テーブルが変更されているROWIDため、行を変更できますか?

4

3 に答える 3

7

「Oracle 8 から、ROWID形式とサイズが 8 バイトから 10 バイトに変更されましたROWID。テーブルを再編成またはエクスポート/インポートすると、 が変更されることに注意してください。パーティション化されたテーブルの場合、行がパーティションから別のパーティションに移行した場合にも変更されます。中の 1 つUPDATE。」

http://www.orafaq.com/wiki/ROWID

いいえと思います。これは、たとえばアプリケーションがROWID一時的に保存する場合 (たとえば、選択可能なアイテムのリストを生成し、それぞれが で識別されますROWIDが、リストは定期的に再生成され、保存されない場合) は安全です。しかし、ROWID永続的な方法で使用される場合、安全ではありません。

于 2012-07-20T20:12:46.377 に答える
6

ROWIDしばらく使用しているSELECTこと、テーブルが標準のヒープ構成テーブルであり、DBA がテーブルに対して何もしていないこと (アプリケーションがオンラインである場合、これはかなり安全な仮定です) を想定しています。 )、ROWID安定します。主キーを使用することが望ましいですが、主キーが使用できない場合、オラクルが開発した多くのツールとフレームワークがROWID短期間使用します。ROWIDたとえば、ユーザーがデータをローカルで編集できるようにしてから、任意の長さの時間SELECT後に master データベースと同期する場合などです。

ROWIDは行の物理的な位置にすぎないため、その位置が変更されると、 が変更されますROWID

  • 索引構成表またはパーティション表を使用している場合、行を更新すると、行が物理的に配置されている場所が変更され、ROWID.
  • 行がヒープ構成表から削除された場合、後続の行は、以前に削除された行INSERTと同じものを使用するまったく異なるデータを持つデータを挿入する可能性があります。ROWID
  • さまざまな管理タスクによって、ROWIDが変更される可能性があります。テーブルをエクスポートおよびインポートするとROWID、たとえば変更されますが、新しいようなオンライン縮小コマンドのようなことも変更されます。ただし、これらの管理タスクは通常、アプリケーションが起動している間は実行されません。また、日中はほぼ確実に実行されません。しかし、DBA がこの種のことを行うときにアプリケーションがシャットダウンされていない場合、またはアプリケーションがデータを保持している場合、問題が発生する可能性があります。

時間が経つにつれて、新しい機能が s に新しい変更の可能性をもたらすことがますます一般的になりましROWIDた。たとえば、索引構成表やオンライン圧縮オプションは比較的新しい機能です。将来的には、少なくとも がROWID変更される可能性を伴う機能がさらに追加される可能性があります。

もちろん、厳密に言えば、主キーに依存するのも安全ではありません。他のセッションが来て、行を読み取った後に行の主キーを更新するか、行を選択した後に他のセッションが行を削除し、同じデータと異なる主キーを持つ新しい行を挿入する可能性は十分にあります。どちらの場合でも、データベースを使用するアプリケーションが実際に何をしていると想定されているかについて、ある程度のローカルな知識を持っていると役に立ちます。たとえば、主キーの更新を許可したり、主キーを再利用したりして、主キーを使用しても安全であると一般的に判断できるようにすることは、非常にまれです。同様に、パーティショニングの使用方法や、索引構成表での索引の定義方法によっては、更新が行われないと結論付けるのが比較的一般的です。ROWID. たとえば、テーブルが によって分割されていることがわかっていて、LOAD_DATEを更新しないことがわかっている場合、更新によるLOAD_DATEへの変更は実際には発生しませんROWID。テーブルがインデックス構成されていることがわかっているが、そのインデックスの一部である列を更新していないことがわかっている場合ROWIDUPDATE.

于 2012-07-20T20:23:06.930 に答える
4

そうするのは安全だとは思いません。理論的には変更されません。もちろん、誰かが「誤って」実際のDBで何かを削除するまでです...

PKを使用するだけで、はるかに理にかなっています。

于 2012-07-20T20:09:56.307 に答える