35

Oracle データベース内のテーブルに対して INSERT、UPDATE、または DELETE ステートメントが最後に実行されたのはいつで、実行された場合はどのように確認できますか?

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

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

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

4

11 に答える 11

62

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

SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable;

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

于 2011-07-26T15:35:33.480 に答える
41

Since you are on 10g, you could potentially use the ORA_ROWSCN pseudocolumn. That gives you an upper bound of the last SCN (system change number) that caused a change in the row. Since this is an increasing sequence, you could store off the maximum ORA_ROWSCN that you've seen and then look only for data with an SCN greater than that.

By default, ORA_ROWSCN is actually maintained at the block level, so a change to any row in a block will change the ORA_ROWSCN for all rows in the block. This is probably quite sufficient if the intention is to minimize the number of rows you process multiple times with no changes if we're talking about "normal" data access patterns. You can rebuild the table with ROWDEPENDENCIES which will cause the ORA_ROWSCN to be tracked at the row level, which gives you more granular information but requires a one-time effort to rebuild the table.

Another option would be to configure something like Change Data Capture (CDC) and to make your OCI application a subscriber to changes to the table, but that also requires a one-time effort to configure CDC.

于 2008-11-05T15:33:13.350 に答える
12

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

AUDIT INSERT ON user.table

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

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

于 2008-11-05T14:35:47.287 に答える
11
SELECT * FROM all_tab_modifications;
于 2014-08-25T14:41:15.657 に答える
6

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

これを達成するためにORA_HASH関数を使用できるようです。

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

于 2008-11-05T13:59:05.863 に答える
5

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

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

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

注意点として、大量のテーブルには CDC が適していますが、DCN はそうではありません。

于 2008-11-05T16:27:17.267 に答える
2

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

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

あなたはそれを「特別な管理者のもの」と考えますか?

より明確な答えが得られるように、実際に何をしているかを説明することをお勧めします。

于 2008-11-05T13:34:35.570 に答える
1

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

于 2008-11-05T14:19:40.783 に答える