找到某个表的数据源 - ORACLE

时间:2014-08-06 04:19:02

标签: sql oracle plsql oracle-sqldeveloper

这可能是一个微不足道的问题。但是当我正在研究很久以前由其他人创建的数据库时,没有包含适当的文档或注释,我遇到了一个关键问题,我需要知道如何将数据插入到某个表中?是否有任何脚本或其他方法可以识别数据源。换句话说,我需要知道是否通过某些程序,功能,手动等插入数据。我无法搜索所有程序或功能,它们是数百个。我正在使用SQL开发人员,它是oracle 11g DB。

2 个答案:

答案 0 :(得分:4)

没有这样的脚本可以通过它来确定表的数据来源。我能想到的最好的是你可以过滤引用表的所有存储过程

SELECT *
  FROM dba_dependencies
 WHERE referenced_owner = 'SCOTT'
   AND referenced_name  = 'YOUR_TABLE_NAME'
   AND referenced_type  = 'TABLE'

或者您可以使用此脚本

SELECT *
  FROM dba_source
 WHERE UPPER(text) LIKE '%YOUR_TABLE_NAME%';

这将过滤掉所引用表的所有存储过程/触发器/其他db代码,然后您必须检查使用insert语句的代码。

答案 1 :(得分:2)

在使用dbms_utility.format_call_stack()记录PL / SQL调用堆栈的表上添加触发器可能会为您提供所需的信息;这是一个将所有插入记录到INS_TEST表中的示例(日志包含在INS_LOG中):

create table ins_test (pk number not null primary key);

create table ins_log(pk number not null primary key,
  text varchar2(4000));

create sequence seq_ins;
create sequence seq_log;  

create or replace trigger tr_air_ins_test after insert on ins_test
for each row
begin
  insert into ins_log(pk, text) values (
    seq_log.nextval, 
    dbms_utility.format_call_stack
  );
end;

create or replace procedure proc1 as
begin
  insert into ins_test values (seq_ins.nextval);
end;

create or replace procedure proc2 as
begin
  insert into ins_test values (seq_ins.nextval);
end;

begin
  proc1;
  proc2;
end; 

insert into ins_test values (seq_ins.nextval);

但在使用之前,您应该运行R.T.建议的SQL语句。 - 它更容易,不会影响您的数据库,可能就足够了。