考虑一个场景,其中有两个表"a"one_answers"B"。
表"A"有一个触发器"Ta"[早在我加入这个项目之前就写了,因此我完全不知道这个触发器],它更新了表"B"中名为"colB"的列。
现在,由于我主要使用表"B",并且担心"colB"的获取方式,所以我不知道触发器"Ta"是否在更新此列。
所以我的问题是,是否有一种直接的oracle查询/方法可以发现一个表中的列是否被另一个表上运行的任何触发器更新?
提前感谢你对我的教育。
问候a.b
SELECT *
FROM
user_sources
WHERE
type = 'TRIGGER'
AND UPPER(text) LIKE '%UPDATE A%';
但如果查询是在两行中,例如:,则它将不起作用
UPDATE
A
SET
...
因为CCD_ 1与对应对象中的给定行相匹配。
Oracle细粒度依赖跟踪知道使用了哪些列。不幸的是,没有办法追踪这种依赖是用于阅读还是写作。并且没有默认的DBA_DEPENDENCY_COLUMNS
视图来查找此信息。
但幸运的是,Rob van Wijk创造了这样一种观点。他的博客有更多的信息,包括拨款和create view
声明,大约在页面的一半。
示例:
drop table a;
drop table b;
create table a(colA number);
create table b(colB number, read_only number, not_used number);
create or replace trigger Ta
after update or insert or delete on a
begin
update b set colB = read_only;
end;
/
--What triggers are referencing B's columns?
select owner, name, type, referenced_column
from dba_dependency_columns
where referenced_owner = user
and referenced_name = 'B'
and type = 'TRIGGER';
OWNER NAME TYPE REFERENCED_COLUMN
----- ---- ---- -----------------
JHELLER TA TRIGGER COLB
JHELLER TA TRIGGER READ_ONLY
该视图使用了几个未记录的表和一些高级SQL功能。在生产服务器上,这种视图不是一个好主意。但它可能比任何涉及解析SQL的解决方案都准确得多。
简单示例:
create table table_a(
id number primary key,
val varchar2( 100 )
);
create table table_b(
len number
);
insert into table_b values ( 0 );
set define off
create or replace trigger after_table_a
after insert on table_a for each row
begin
UpDate
table_B
set len = len + length( :new.val );
end;
/
insert into table_a values ( 1, 'Ala ma kota');
insert into table_a values ( 2, 'As to ali pies');
commit;
select * from table_b;
LEN
----------
25
查询:
select trigger_name,
regexp_substr( trigger_body, 'updates+table_b',1,1,'i') update_command
from (
select ut.trigger_name,
dbms_metadata.GET_DDL('TRIGGER', ut.trigger_name) trigger_body
from user_dependencies ud
join user_triggers ut on ( ud.type = 'TRIGGER'
and ut.trigger_name = ud.name
and ut.table_name <> ud.referenced_name )
where ud.referenced_name = 'TABLE_B'
)
where regexp_instr( trigger_body, 'updates+table_b',1,1,0,'i') > 0 ;
TRIGGER_NAME UPDATE_COMMAND
------------- ------------------
AFTER_TABLE_A UpDate
table_B