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