4

我负责一个我们没有任何文档的 Oracle 数据库。目前我需要知道一个表是如何被填充的。

如何找出该表从哪个过程、触发器或其他源获取数据?

4

6 回答 6

8

或者更好的是,查询DBA_DEPENDENCIES表(或其等价物USER_)。您应该看到哪些对象依赖于它们以及谁拥有它们。

select owner, name, type, referenced_owner
from dba_dependencies
where referenced_name = 'YOUR_TABLE'

是的,您需要查看对象以查看其中是否发生了 INSERT。

这也是我上面的评论。

如果它不是生产系统,我建议您在 INSERT 之前使用一些自定义消息在 TRIGGER 中引发用户定义的异常,或者从 INSERT 中锁定表并监视尝试插入它们的应用程序失败。但是,是的,您可能还会接到许多愤怒的人的电话。

于 2010-05-18T14:28:27.477 回答
6

这很简单;-)

SELECT * FROM USER_SOURCE WHERE UPPER(TEXT) LIKE '%NAME_OF_YOUR_TABLE%';

在输出中,您将拥有所有过程、函数等,它们在主体中调用名为 NAME_OF_YOUR_TABLE 的表。

NAME_OF_YOUR_TABLE 必须大写,因为我们使用 UPPER(TEXT) 来检索 Name_Of_Your_Table、NAME_of_YOUR_table、NaMe_Of_YoUr_TaBlE 等结果。

于 2010-05-18T14:21:15.277 回答
2

另一个想法是尝试查询 v$sql 以找到执行更新的语句。您可能会从模块/操作(或 10g progam_id 和 program_line#)中得到一些东西。

于 2010-05-19T00:38:15.353 回答
1

听起来你想审计。

怎么样

AUDIT ALL ON ::TABLE::;

或者在表上应用 DBMS_FGA 策略并收集客户端、程序、用户,也许调用堆栈也可用。

于 2012-04-24T03:01:36.977 回答
1

DML 更改记录在 *_TAB_MODIFICATIONS 中。

在不创建触发器的情况下,您可以使用 LOG MINER 查找所有数据更改以及来自哪个会话。

使用触发器,您可以将 SYS_CONTEXT 变量记录到表中。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions165.htm#SQLRF06117

于 2010-05-19T06:02:51.710 回答
0

迟到了!

我也支持 Gary 对 v$sql 的提及。只要查询没有被刷新,这可能会产生快速的答案。

如果您在当前实例中知道它,我喜欢上面使用的组合;如果没有动态 SQL,则 xxx_Dependencies 可以正常工作。

将其加入 xxx_Source 以获得讨厌的动态 SQL。

我们还使用 SQL*Plus 复制命令将数据引入我们的开发实例(小心!已弃用!),但也可以通过 imp 或 impdp 引入数据。检查 xxx_Directories 是否有幸将数据带入/带出的目录。

于 2016-08-31T12:59:36.270 回答