感知Oracle中DML访问/更新的对象

时间:2011-01-31 15:31:02

标签: oracle dependencies dml

我正在为我们的数据库中的更改实现依赖系统,所以例如对于这个和这个更改我们需要那个和那个状态的对象。使用DDL依赖项很容易,但我需要知道,给定的DML子句引用了哪些对象。而后者也可以是动态的。

所以问题是:有没有办法说,给定的DML代码引用了哪些表?

我主要对那些不会立即修改我的数据集的条款感兴趣,但可能会在客户端修改它,因为我不可能拥有所有的变化。因此,间接的理解方式(如执行DML然后检查哪些表已被更改)不是一种选择。

2 个答案:

答案 0 :(得分:2)

如果DML代码是查询,您可以解释它,然后检查PLAN_TABLEdbms_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解析器。

答案 1 :(得分:1)

我进一步调查并发现:

  1. 数据库更改通知对于不修改当前数据状态的任何内容的子句不起作用(SURPRISE!)。

  2. 但我想我最终会使用AUDIT / FGA。截至目前,它似乎理解了一些条款,它们并没有真正改变任何东西,适用于PL / SQL块中的显式和动态DML,并且提供了object_name - 这正是我所需要的。