如何找出数据库表的填充位置?

时间:2010-05-18 14:08:22

标签: database oracle triggers procedure

我负责Oracle数据库,我们没有任何文档。目前,我需要知道如何表格已填充。

如何找出此表从哪个程序,触发器或其他来源获取数据?

6 个答案:

答案 0 :(得分:8)

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

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

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

这也是我上面的评论。

  

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

答案 1 :(得分: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等。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

DML更改记录在* _TAB_MODIFICATIONS。

如果不创建触发器,您可以使用LOG MINER查找所有数据更改以及从哪个会话。

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

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

答案 4 :(得分:1)

听起来你想要审核。

怎么样

AUDIT ALL ON ::TABLE::;

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

答案 5 :(得分:0)

晚会!

我第二次提到v $ sql也是如此。只要查询没有被刷新,这可能会产生快速答案。

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

将它加入xxx_Source以获得那个讨厌的动态SQL。

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