Pular para o conteúdo principal

Mostrando Recursivamente as dependencias ou o reverso: quais objetos são dependes de...

Em alguns casos, você quer saber quais são as dependências de um objeto, por exemplo:
- O que acontece se recompilar o objeto em questão
- Objetos que evitam a compilação do objeto em questão (exemplo: data-dictionary e objeto no esquema errado)

Uma outra questão pode ser que os objetos são dependentes de um objeto específico (dependências reversa), por exemplo:
- Objetos que serão invalidados caso eu dropar objeto em questão.
- Qual é a dependência em cascata para este objeto específico.

Como a view dba_dependencies não tem as informações necessárias podemos utilizar as procedures abaixo (Lembre que para compilar, é necessário grant nas views dba_dependencies e dba_objects)


-- Mostrar dependencias de um objeto:

create or replace procedure denilson.recur_object(v_owner in varchar2,
v_object_name varchar2,
v_object_type varchar2,
level number default 0) is
cursor c_depen is
select referenced_owner, referenced_name, referenced_type
from sys.dba_dependencies
where dba_dependencies.owner = v_owner
and dba_dependencies.name = v_object_name
and dba_dependencies.type = v_object_type;
i integer;
object_id dba_objects.object_id%type;
datum varchar2(25);
time_stamp dba_objects.timestamp%type;
v_status dba_objects.status%type;
begin
select object_id,
to_char(last_ddl_time, 'dd-mon-yyyy hh24:mi:ss'),
timestamp,
status
into object_id, datum, time_stamp, v_status
from sys.dba_objects
where dba_objects.owner = v_owner
and dba_objects.object_name = v_object_name
and dba_objects.object_type = v_object_type;
dbms_output.put_line('Level: ' || ' ' || level || ' ' || object_id || ' ' ||
v_owner || ' ' || v_object_name || ' ' ||
v_object_type || ' ' || datum || ' ' || time_stamp || ' ' ||
v_status);
for c_rec in c_depen loop
recur_object(c_rec.referenced_owner,
c_rec.referenced_name,
c_rec.referenced_type,
level + 1);
end loop;
exception
when no_data_found then
dbms_output.put_line('No record found for: ' || ' ' || v_owner || ' ' ||
v_object_name || ' ' || v_object_type);
end;
/

-- Testando:
sql> alter session set nls_date_format='dd-mon-yyyy hh24:mi:ss';
sql> set linesize 256sql> set trimspool onsql> set serveroutput onsql> exec dbms_output.enable(1000000);

exec recur_object(upper('&owner'),upper('&object_name'),upper('&object_type'));



-- -- Mostrar dependencias para um objeto:

create or replace procedure denilson.recur_object_reverso(v_owner in varchar2,
v_object_name varchar2,
v_object_type varchar2,
level number default 0) is
cursor c_depen_reverse is
select owner, name, type
from dba_dependencies
where dba_dependencies.referenced_owner = v_owner
and dba_dependencies.referenced_name = v_object_name
and dba_dependencies.referenced_type = v_object_type;

i integer;
object_id dba_objects.object_id%type;
datum varchar2(25);
time_stamp dba_objects.timestamp%type;
v_status dba_objects.status%type;
begin
select object_id,
to_char(last_ddl_time, 'dd-mon-yyyy hh24:mi:ss'),
timestamp,
status
into object_id, datum, time_stamp, v_status
from dba_objects
where dba_objects.owner = v_owner
and dba_objects.object_name = v_object_name
and dba_objects.object_type = v_object_type;

dbms_output.put_line('Level: ' || ' ' || level || ' ' || object_id || ' ' ||
v_owner || ' ' || v_object_name || ' ' ||
v_object_type || ' ' || datum || ' ' || time_stamp || ' ' ||
v_status);

for c_rec in c_depen_reverse loop
recur_object_reverse(c_rec.owner, c_rec.name, c_rec.type, level + 1);

end loop;
exception
when no_data_found then
dbms_output.put_line('No record found for: ' || ' ' || v_owner || ' ' ||
v_object_name || ' ' || v_object_type);
end;
/

-- Testando:sql> alter session set nls_date_format='dd-mon-yyyy hh24:mi:ss';sql> set linesize 256sql> set trimspool onsql> set serveroutput onsql> exec dbms_output.enable(1000000);sql> exec recur_object_reverse(upper('&owner'),upper('&object_name'),upper('&object_type'));

-- Mostra todas as dependencias recursivamente no schema:

create or replace procedure recur_owner(v_owner in varchar2) is
cursor c_obj is
select object_name, object_type
from dba_objects
where dba_objects.owner = v_owner
order by object_name, object_type;
begin
for c_rec in c_obj loop
dbms_output.put_line('.');
recur_object(v_owner, c_rec.object_name, c_rec.object_type);
end loop;
end;
/

-- Testando:
sql> alter session set nls_date_format='dd-mon-yyyy hh24:mi:ss';sql> set linesize 256sql> set trimspool onsql> set serveroutput onsql> exec dbms_output.enable(1000000);sql> exec recur_owner(upper('&owner'));

Comentários

  1. Realmente muito útil... só algo que percebi, posso estar errado, mas quando as dependências em uma procedure encontra-se dentro de um CURSOR ele não identifica, correto?

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Index SKIP SCAN???

Index Skip Scan nada mais é que o "split" logico de um indice composto, ou seja, se sua clausula WHERE não tiver todos os campos do indice composto, ele é dividido em menores sub-indices Exemplo: -------- SQL> create table teste(a number,b number); Table created. SQL> begin 2 for i in 1..1000 3 loop 4 insert into teste values(i, 56); 5 end loop; 6 end; 7 / PL/SQL procedure successfully completed. SQL> create index idx_teste on teste(a,b); Index created. SQL> analyze table teste compute statistics; Table analyzed. SQL> explain plan for select /*+ index_ss(teste idx_teste) */ * from teste where b=56; Explained. SQL> start ?\rdbms\admin\utlxpls.sql -------------------------------------------------------------------------------- | Operation | Name | Rows | Bytes| Cost | Pstart| Pstop | -------------------------------------------------------------------------------- | SELECT STATEMENT | | 1

Webcenter Content - Jython to Checkin Content with Attachments (CHECKIN_NEW_WITH_RENDITIONS)

In the last few days, i had to load a content that, by its requirements, needs to attach files to the content. My first alternative would be Batch Loading, however for the bacth loder file it was not possible because it does not actually support the rendition service. With the next option, i tried to use the IdcCommand, but still had many problems, such as errors below: sample hda file: [oracle @ hostname bin] $ cat idctst.txt @Properties LocalData IdcService = EDIT_RENDITIONS dID = 37020 renditionKeys = addRendition0 addRendition0.name = test543 addRendition0.action = edit addRendition0.file = test.txt addRendition0.file: path = / u01 / oracle / domains / content_domain / ucm / cs / vault / ~ temp / test.txt @end << EOD >> Executing: [oracle @ hostname bin] $ ./IdcCommand -f idctst.txt -u sysadmin -l log.log -c server Error: Java HotSpot (TM) 64-Bit Server VM warning: Using the ParNew young collector with the Serial old collector is deprecated and w

Configurar Tamanho de UNDO e tempo de RETENÇÃO (UNDO_RETENTION)

-- Tamanho Undo Atual SELECT SUM(a.bytes) "UNDO_SIZE" FROM v$datafile a, v$tablespace b, dba_tablespaces c WHERE c.contents = 'UNDO' AND c.status = 'ONLINE' AND b.name = c.tablespace_name AND a.ts# = b.ts#; -- Blocos de UNDO por Seg. SELECT MAX(undoblks/((end_time-begin_time)*3600*24)) "UNDO_BLOCK_PER_SEC" FROM v$undostat; --Tamanho do Bloco SELECT TO_NUMBER(value) "DB_BLOCK_SIZE [KByte]" FROM v$parameter WHERE name = 'db_block_size'; -- Select calcula UNDO RETENTION SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]", SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]", ROUND((d.undo_size / (to_number(f.value) * g.undo_block_per_sec))) "OPTIMAL UNDO RETENTION [Sec]" FROM ( SELECT SUM(a.bytes) undo_size FROM v$datafile a, v$tablespace b, dba_tablespaces c WHERE c.contents = 'UNDO'