代码之家  ›  专栏  ›  技术社区  ›  Hawk Fabio

查找特定表的数据源-ORACLE

  •  4
  • Hawk Fabio  · 技术社区  · 10 年前

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

    2 回复  |  直到 10 年前
        1
  •  6
  •   Rahul Tripathi    10 年前

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

    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%';
    

    这将过滤掉表中引用的所有存储的procs/triggers/otherdb代码,然后您必须检查 insert 语句。

        2
  •  2
  •   Frank Schmitt    10 年前

    在记录PL/SQL调用堆栈的表上添加触发器 dbms_utility.format_call_stack() 可能会提供您所需的信息;下面是一个将所有插入记录到 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语句-这更简单,不会影响数据库,可能就足够了。