1

DBの変更に対して依存関係システムを実装しているので、たとえば、この変更とこの変更には、そのような状態のオブジェクトとそのオブジェクトが必要です。DDL依存関係を使用すると簡単ですが、特定のDML句によってどのオブジェクトが参照されているかを知る必要があります。そして後者も動的である可能性があります。

したがって、問題は次のとおりです。特定のDMLコードによってどのテーブルが参照されているかを言う方法はありますか?

主に、データセットのテーブルをすぐに変更しない句に興味がありますが、すべてのバリエーションを持つことができない可能性があるため、クライアント側でテーブルを変更する可能性があります。したがって、間接的な理解方法(DMLを実行してから、変更されたテーブルを確認するなど)はオプションではありません。

4

2 に答える 2

2

DMLコードがクエリの場合は、それを説明してから、PLAN_TABLEまたはdbms_xplan.display_cursorをチェックして、クエリによって参照されているオブジェクトをチェックできます。

SQL> delete from plan_table;

4 rows deleted

SQL> explain plan for select * from scott.emp;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2872589290
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   518 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   518 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

8 rows selected

SQL> SELECT operation, object_owner, object_name FROM plan_table;

OPERATION            OBJECT_OWNER       OBJECT_NAME
-------------------- ------------------ --------------------
SELECT STATEMENT                        
TABLE ACCESS         SCOTT              EMP

明らかに、これにはクエリがデータベースで有効である必要があります(参照されているすべてのオブジェクトがすでに存在しているなど)。分析するコードがPL/SQLブロックの場合、DIYパーサーを作成する以外にどのようにそれを実行できるかわかりません。

于 2011-01-31T16:01:29.460 に答える
1

さらに調査したところ、次のことがわかりました。

  1. データベースの変更通知は、データの現在の状態で何も変更しない句では機能しません (驚き!)。

  2. しかし、最終的には AUDIT/FGA を使用すると思います。今のところ、実際には何も変更せず、PL/SQL ブロックの明示的 DML と動的 DML の両方でうまく機能し、object_name を提供する句を理解しているようです。これがまさに私が必要としているものです。

于 2011-02-01T10:28:27.163 に答える