2011-01-31 9 views
1

私はタスクを実行する必要がありますが、私はそれをどうするかわかりません。ここでOracleトレースall SELECTS

は問題です:

私はOracleデータベースと多くのプロセスに約1000のテーブルを持っています。

各プロセスは、1つまたは複数のテーブルで1つ以上のSELECTを実行します。 ソースコードを調べてどのプロセスがどのテーブルでどのプロセスを実行しているのかを見つけることはほとんど不可能なので、すべてのテーブルでSELECTに何らかのトリガをかけたいと思います。 アイデアは、どのテーブルがクエリするかを見るためにプロセスを1つずつ起動することです。

私はSELECTにトリガーがないことを知っていますが、他に何かありますか?

私はワンショットでこれを行う必要があり、必要な情報を回復するだけで毎日実行されません。

答えて

3

auditingを有効にすることができます。 1つのレコードのみがセッションごとにアクセスし、テーブルごとに監査証跡に書き込まれるように、あなたはBY SESSIONを指定することができ

AUDIT SELECT TABLE; 

:あなたはすべてをしてSELECTを監査することができます。

AUDIT_TRAILパラメータは、DBまたはOSのいずれかに設定する必要があります。 DBに設定されている場合、監査証跡はSYS.AUD$テーブルに書き込まれます。

+0

はい、これは私の問題に最適な解決策かもしれません。 DBAと話をして、AUDIT_TRAILを有効にする必要があります。なぜなら、今は無効になっているからです。答えをありがとう。 –

+0

on * nixシステムでは、OSのロギングが任意のディレクトリに移動することに注意してください。ウィンドウでは、イベントログに移動します。 – DCookie

1

用語の「プロセス」を特定のOracleセッションにマップできると仮定すると、trace the Oracle sessionとなります。そのセッションで実行されたすべてのSQL文が表示されます。

また、クライアントマシンが何であれ、S QL*Net traceを実行することもできます(3層環境の「クライアントマシン」はアプリケーションサーバーです)。しかし、SQL * Netのトレースは、それほど簡単ではありません。

+0

私はたくさんのログを持っているので、この解決策はベストではありません。各プロセスは多くの選択をしますので、ログファイル(巨大なログファイル)から必要な情報を取得することはほとんど不可能です。 –

+0

@CC - 私は異論に従うかどうかわかりません。リテラルSQL(および場合によってはバインド変数)を各リクエストに見たい場合は、かなりのロギングが必要でありたいと思うでしょう。 SQLのサブセットのみを気にしているのであれば、はるかに簡単なアプローチがありますが、これはあなたが最初に求めたものではありません。 –

+0

ああ、私は各プロセスのテーブル名だけを必要とします。 –