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

Webcenter Content - Cache Configuration for JdbcFileStore configuration

The configuration values below, control the temporarily cached files keep in FileCache table. FsCacheThreshold Specifies the maximum cache size, in megabytes (default=100) Once the threshold is met, Content Server starts deleting files that are older than the minimum age, as specified by the FsMinimumFileCacheAge parameter FsMaximumFileCacheAge The age at which files are deleted, expressed in days. The default is 365 days FsMinimumFileCacheAge The minimum age at which cached files can be deleted This parameter is used in conjunction with the FsCacheThreshold parameter to determine when to delete cached files FsCleanUpCacheDuringIndexing This parameter activates vault cache cleaning, while FsCacheThreshold, FsMaximumFileCacheAge and FsMinimumFileCacheAge are controling its behaviour.  Expect, when this is enabled on a system that currently has a large number of files in the FileCache table, the first cycle will take a long time to complete. How to Confi...

Assign Backup Policy for Boot and Block Volumes - OCI

To get Availability Domain oci iam availability-domain list  #!/bin/bash OCI_AD="hQsi:SA-SAOPAULO-1-AD-1" OCI_COMPARTMENT="ocid1.compartment.oc1..aaaaaaaavgyjpoffz5qliieawamjaksfb6juxejurtduclqjkvv66ookcxja" #Get Silver policy ocid funct_get_policy(){ OCI_POL_OCID=$(oci bv volume-backup-policy list | jq -r '.data[] | select(."display-name"|contains("silver"))' | jq -r '.id') } funct_boot_vol (){ #Create a file with all boot volume ocid oci bv boot-volume list --availability-domain ${OCI_AD} -c  ${OCI_COMPARTMENT} | jq -r '.data[].id' > boot-vol.txt while IFS="" read -r p || [ -n "$p" ] do   printf 'Seeting backup policy for %s\n' "$p"   oci bv volume-backup-policy-assignment create  --asset-id  $p  --policy-id ${OCI_POL_OCID} done < boot-vol.txt } funct_block_vol (){ #Create a file with all block volume ocid oci bv volume list  -c ${OCI_COMPARTMENT} | jq -r '.data[].id' ...

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' ...