web-dev-qa-db-ja.com

Oracleテーブルが最後に更新された時期を調べる方法

Oracleデータベースのテーブルで最後のINSERT、UPDATE、またはDELETEステートメントがいつ実行されたかを確認できますか?

背景:Oracleバージョンは10gです。定期的に実行し、単一のOracleテーブルからデータを読み取り、ファイルに書き込むバッチアプリケーションがあります。ジョブが最後に実行されてからデータが変更されていない場合は、これをスキップします。

アプリケーションはC++で記述されており、OCIを介してOracleと通信します。 「通常の」ユーザーでOracleにログインするため、特別な管理機能は使用できません。

編集:さて、「特別な管理スタッフ」は正確な説明ではありませんでした。つまり、テーブルからのSELECTとストアドプロシージャの呼び出し以外には何もできません。データベース自体について何かを変更する(トリガーを追加するなど)は、残念ながら2010年より前にそれを完了したい場合にはオプションではありません。

23
Maximilian

10gを使用しているため、ORA_ROWSCN疑似列。これにより、行の変更の原因となった最後のSCN(システム変更番号)の上限がわかります。これは増加するシーケンスであるため、最大ORA_ROWSCNあなたが見たことがあり、それよりも大きいSCNを持つデータのみを探します。

デフォルトでは、ORA_ROWSCNは実際にはブロックレベルで維持されるため、ブロック内の行を変更するとORA_ROWSCNブロック内のすべての行。 「通常の」データアクセスパターンについて話している場合に、変更せずに複数回処理する行の数を最小限に抑えることを目的とする場合は、おそらくこれで十分です。 ROWDEPENDENCIESを使用してテーブルを再構築すると、ORA_ROWSCN行レベルで追跡されます。これにより、より詳細な情報が得られますが、テーブルを再構築するのに1回の努力が必要です。

もう1つのオプションは、変更データキャプチャ(CDC)などを構成し、OCIアプリケーションをテーブルの変更のサブスクライバにすることですが、CDCを構成するための1回限りの作業も必要です。

37
Justin Cave

私はこのパーティーに本当に遅れていますが、ここに私がそれをした方法があります:

SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable;

私の目的には十分近いです。

44
Paul

監査についてDBAに問い合わせてください。彼は次のような簡単なコマンドで監査を開始できます。

AUDIT INSERT ON user.table

次に、テーブルUSER_AUDIT_OBJECTをクエリして、最後のエクスポート以降にテーブルに挿入があったかどうかを判断できます。

詳細については、Google for Oracle監査...

9
dub
SELECT * FROM all_tab_modifications;
8
grokster

結果に対して何らかのチェックサムを実行し、それをローカルに保存できますか?次に、アプリケーションがデータベースを照会するときに、そのチェックサムを比較して、インポートする必要があるかどうかを判断できますか?

ORA_HASH 関数を使用してこれを達成できる可能性があるようです。

更新:もう1つの優れたリソース: 2つのOracleテーブルのデータが等しいかどうかを判断する10gのORA_HASH関数

7
mwilliams

Oracleは変更をテーブルで監視でき、変更が発生するとPL/SQLまたはOCIでコールバック関数を実行できます。コールバックは、変更されたテーブルのコレクションであり、変更されたROWIDのコレクションと、アクションのタイプIns、upd、delを持つオブジェクトを取得します。

だから、テーブルに行くことさえせず、座って呼ばれるのを待つ。書き込む変更がある場合にのみ移動します。

データベース変更通知 と呼ばれます。 Justinが述べたように、CDCよりもはるかに単純ですが、どちらもいくつかの派手な管理機能を必要とします。良い点は、これらのどちらもアプリケーションの変更を必要としないことです。

警告は、CDCは大量のテーブルには適していますが、DCNはそうではないということです。

4
Mark Brady

サーバーで監査が有効になっている場合は、単に使用します

SELECT *
FROM ALL_TAB_MODIFICATIONS
WHERE TABLE_NAME IN ()
2
hui chen

バッチ処理でファイルを書き込むのにどれくらい時間がかかりますか?先に進んでから、ファイルを前回の実行のファイルのコピーと比較して、それらが同一であるかどうかを確認するのが最も簡単な場合があります。

1
Tony Andrews

別のテーブルの値をsysdateに設定する挿入、更新、削除のトリガーを追加する必要があります。

アプリケーションを実行すると、値が読み取られ、どこかに保存されるため、次回の実行時に比較する参照ができます。

その「特別な管理スタッフ」を検討しますか?

あなたが実際に何をしているのかを説明して、より明確な答えを得られるようにする方が良いでしょう。

1

まだ答えを探している人がいれば、Oracle 10gに付属の Oracle Database Change Notification 機能を使用できます。 CHANGE NOTIFICATIONシステム権限が必要です。アプリケーションへの通知をトリガーするタイミングをリスナーを登録できます。

0
TMtech