Sunteți pe pagina 1din 8

ORACLE Way to find out the Dependency (Uses) of an Object

Suppose we have an instance named SCOTT with password TIGER at dwdev1. To track the Dependency (Uses) of an Object, we have to build some tables and functions on the basis of which, this utility will work.

1.1 Objective :
Database object dependency tracker utility is used to track the dependency of an object on other database objects. There are 2 utilities designed for this. One is for tracking the objects dependent on a given database object and another one is for tracking objects on which the given object is dependent. The definitions of some objects, including views and procedures, reference other objects, such as tables. As a result, the objects being defined are dependent on the objects referenced in their definitions. For example, a view is defined by a query that references tables or other views. A procedure's body can include SQL statements that reference other objects of a database. An object that references another object as part of its definition is called a dependent object, while the object being referenced is a referenced object. If you alter the definition of a referenced object, dependent objects may or may not continue to function without error, depending on the type of alteration. For example, if you drop a table, no view based on the dropped table is usable. Oracle automatically records dependencies among objects to alleviate the complex job of dependency management for the database administrator and users. For example, if you alter a table on which several stored procedures depend, Oracle automatically recompiles the dependent procedures the next time the procedures are referenced (run or compiled against). To manage dependencies among schema objects, all of the schema objects in a database have a status. Only dependent objects can be invalid. Tables, sequences, and synonyms are always valid.

The Utility describes all dependencies in the database between procedures, packages, functions, package bodies, and triggers, including dependencies on views created without any database links

1.2 Execute the attached code to extract the list of objects, which the dependent on given object.

-------------------------------------------------------CONN SCOTT/TIGER@dwdev1; -------------------------------------------------------CREATE GLOBAL TEMPORARY TABLE SHOW_DEPENDENCY_TBL ( SerialNo Number(5), obj_name varchar2(30), Obj_type varchar2(30), Obj_level Number(5), dep_obj_name varchar2(30), dep_obj_type varchar2(30), owner varchar2(30)) ON COMMIT PRESERVE ROWS;

CREATE GLOBAL TEMPORARY TABLE SHOW_DEPENDENCY_TREE ( SerialNo number, obj_name varchar2(30), Obj_type varchar2(30), Obj_level Number(5), owner varchar2(30), dep_obj_type varchar2(30), dep_obj_name varchar2(400) ) ON COMMIT PRESERVE ROWS; GRANT ALL ON SHOW_DEPENDENCY_TBL TO PUBLIC; GRANT ALL ON SHOW_DEPENDENCY_TREE TO PUBLIC;

Create or replace PACKAGE DEPS_USES AS /* Develop by Pankaj Kumar(C) [cc_pkum11] on 26.10.2009 for check the dependency of an object */ lv_level number := 0; lv_obj_name varchar2(30); lv_obj_type varchar2(30); lv_obj_owner varchar2(30); lv_obj_name1 varchar2(30); lv_obj_type1 varchar2(30); lv_obj_owner1 varchar2(30); lv_serial number(5) := 0; tbl_empty_first_time number := 0; gv_obj_name varchar2(30); PROCEDURE Show_dependency(Obj_owner in varchar2, Obj_name in Varchar2, Obj_type in Varchar2, lvl in number default 0); PROCEDURE Show_deps(Obj_owner in varchar2, Obj_name in Varchar2, Obj_type in Varchar2, lvl in number default 0); PROCEDURE INSIDE_VIEW(Obj_owner in varchar2, Obj_name in Varchar2, Obj_type in Varchar2, lvl in number default 0); PROCEDURE INSERT_TABLE(Obj_owner in varchar2, Obj_name in Varchar2, Obj_type in Varchar2, lvl in number default 0); END DEPS_USES; /

CREATE OR REPLACE PACKAGE BODY DEPS_USES AS /* Develop by Pankaj Kumar(C) [cc_pkum11] on 26.10.2009 for check the dependency of an object */ -------------------------------------------------------Procedure INSIDE_VIEW(Obj_owner in varchar2, Obj_name in Varchar2, Obj_type in Varchar2, lvl in number default 0) IS Cursor C3(c_obj_owner in varchar2, c_obj_name in varchar2, c_obj_type in varchar2) is SELECT * FROM DBA_DEPENDENCIES WHERE NAME = UPPER(c_obj_name) AND TYPE = UPPER(c_obj_type) AND OWNER = UPPER(c_obj_owner) AND REFERENCED_OWNER NOT IN ('SYS')

AND (REFERENCED_NAME NOT IN ('DUAL') AND REFERENCED_NAME NOT LIKE 'DBMS_%') AND REFERENCED_TYPE NOT IN ('SEQUENCE', 'NON-EXISTENT'); BEGIN lv_obj_name1 := Obj_name; lv_obj_type1 := Obj_type; lv_obj_owner1 := Obj_owner; for k in c3(lv_obj_owner1, lv_obj_name1, lv_obj_type1) loop if k.referenced_type = 'VIEW' then lv_serial := lv_serial +1; insert into SHOW_DEPENDENCY_TBL(SerialNo, obj_name, obj_type, dep_obj_name, dep_obj_type, owner) VALUES (lv_serial, k.name, k.type, k.referenced_name, k.referenced_type, k.referenced_owner); commit; DEPS_USES.INSIDE_VIEW(k.referenced_owner, k.referenced_name, k.referenced_type, 0); else lv_serial := lv_serial +1; insert into SHOW_DEPENDENCY_TBL(SerialNo, obj_name, obj_type, dep_obj_name, dep_obj_type, owner) VALUES (lv_serial, k.name, k.type, k.referenced_name, k.referenced_type, k.referenced_owner); commit; end if; end loop; END; -------------------------------------------------------PROCEDURE INSERT_TABLE(Obj_owner in varchar2, Obj_name in Varchar2, Obj_type in Varchar2, lvl in number default 0) IS Cursor C4(c_obj_owner in varchar2, c_obj_name in varchar2, c_obj_type in varchar2) is SELECT * FROM DBA_DEPENDENCIES WHERE NAME = UPPER(c_obj_name) AND TYPE = UPPER(c_obj_type) AND owner = UPPER(c_obj_owner) AND REFERENCED_OWNER NOT IN ('SYS') AND (REFERENCED_NAME NOT IN ('DUAL') AND REFERENCED_NAME NOT LIKE 'DBMS_%') AND REFERENCED_TYPE IN ('TABLE', 'SYNONYM'); BEGIN for L in c4(obj_owner, obj_name, obj_type) loop lv_serial := lv_serial +1; insert into SHOW_DEPENDENCY_TBL(SerialNo, obj_name, obj_type, dep_obj_name, dep_obj_type, owner) VALUES (lv_serial,l.name, l.type, l.referenced_name, l.referenced_type, l.referenced_owner); commit; end loop; end; -------------------------------------------------------Procedure Show_dependency(Obj_owner in varchar2, Obj_name in Varchar2, Obj_type in Varchar2, lvl in number default 0) IS Cursor C1 is select distinct D.NAME, D.TYPE, D.REFERENCED_NAME, u.object_type, D.REFERENCED_OWNER FROM (SELECT level obj_lvl, object_id FROM SYS.public_dependency s START WITH s.object_id = (select object_id from all_objects

where object_type in ('FUNCTION', 'MATERIALIZED VIEW', 'PACKAGE BODY', 'PACKAGE', 'PROCEDURE', 'TABLE', 'VIEW') and owner = UPPER(lv_obj_owner) and object_name = UPPER(lv_obj_name) and object_type = UPPER(lv_obj_type) ) CONNECT BY s.object_id = PRIOR referenced_object_id GROUP BY level, object_id )tree, all_objects u, DBA_DEPENDENCIES D WHERE u.object_type in ('FUNCTION', 'MATERIALIZED VIEW', 'PACKAGE BODY', 'PACKAGE', 'PROCEDURE', 'TABLE', 'VIEW') AND tree.object_id = u.object_id AND D.NAME = UPPER(lv_obj_name) AND D.REFERENCED_NAME = U.OBJECT_NAME AND D.TYPE = UPPER(lv_obj_type) AND D.OWNER = UPPER(lv_obj_owner) --Added AND D.REFERENCED_OWNER NOT IN ('SYS') AND (D.REFERENCED_NAME NOT IN ('DUAL') AND D.REFERENCED_NAME NOT LIKE 'DBMS_%') AND D.REFERENCED_TYPE NOT IN ('SEQUENCE') AND D.REFERENCED_NAME <> UPPER(lv_obj_name) union SELECT NAME, TYPE, REFERENCED_NAME, referenced_type "object_type", REFERENCED_OWNER FROM DBA_DEPENDENCIES WHERE NAME = UPPER(lv_obj_name) AND TYPE = UPPER(lv_obj_type) AND OWNER = UPPER(lv_obj_owner) AND REFERENCED_OWNER NOT IN ('SYS') AND (REFERENCED_NAME NOT IN ('DUAL') AND REFERENCED_NAME NOT LIKE 'DBMS_%') AND REFERENCED_TYPE IN ('TABLE', 'SYNONYM'); Cursor C2(c_obj_owner in varchar2, c_obj_name in varchar2, c_obj_type in varchar2) is SELECT * FROM DBA_DEPENDENCIES WHERE NAME = UPPER(c_obj_name) AND TYPE = UPPER(c_obj_type) AND owner = UPPER(c_obj_owner) AND REFERENCED_OWNER NOT IN ('SYS') AND (REFERENCED_NAME NOT IN ('DUAL') AND REFERENCED_NAME NOT LIKE 'DBMS_%') AND REFERENCED_TYPE NOT IN ('SEQUENCE', 'NON-EXISTENT'); Begin tbl_empty_first_time := tbl_empty_first_time +1; lv_obj_owner := Obj_owner; lv_obj_name := Obj_name; lv_obj_type := Obj_type; for i in c1 loop lv_serial := lv_serial +1; insert into SHOW_DEPENDENCY_TBL(SerialNo, obj_name, obj_type, dep_obj_name, dep_obj_type, owner) VALUES (lv_serial, i.name, i.type, i.referenced_name, i.object_type, i.referenced_owner); -----DEPS_USES.insert_table(lv_obj_name, lv_obj_type, lvl); COMMIT; if i.object_type in ('FUNCTION', 'PACKAGE BODY', 'PACKAGE', 'PROCEDURE') THEN DEPS_USES.Show_dependency(i.referenced_owner, i.referenced_name, i.object_type, 0); end if; if i.object_type in ('MATERIALIZED VIEW', 'TABLE', 'VIEW') THEN for j in c2(i.referenced_owner, i.referenced_name, i.object_type) loop if j.referenced_type in ('FUNCTION', 'PACKAGE BODY', 'PACKAGE', 'PROCEDURE') THEN

DEPS_USES.Show_dependency(j.referenced_owner, j.referenced_name, j.referenced_type, 0); elsif j.referenced_type in ('VIEW') then lv_serial := lv_serial +1; insert into SHOW_DEPENDENCY_TBL(SerialNo, obj_name, obj_type, dep_obj_name, dep_obj_type, owner) VALUES (lv_serial, i.referenced_name, i.object_type, j.referenced_name, j.referenced_type, j.referenced_owner); COMMIT; DEPS_USES.INSIDE_VIEW(j.referenced_owner, j.referenced_name, j.referenced_type, 0); else lv_serial := lv_serial +1; insert into SHOW_DEPENDENCY_TBL(SerialNo, obj_name, obj_type, dep_obj_name, dep_obj_type, owner) VALUES (lv_serial, i.referenced_name, i.object_type, j.referenced_name, j.referenced_type, j.referenced_owner); COMMIT; end if; end loop; end if; end loop; end; -------------------------------------------------------Procedure Show_deps(Obj_owner in Varchar2, Obj_name in Varchar2, Obj_type in Varchar2, lvl in number default 0) IS BEGIN EXECUTE IMMEDIATE ('DELETE FROM SCOTT.SHOW_DEPENDENCY_TBL'); EXECUTE IMMEDIATE ('DELETE FROM SCOTT.SHOW_DEPENDENCY_TREE'); COMMIT; gv_obj_name := Obj_name; begin DEPS_USES.Show_dependency(Obj_owner, Obj_name, Obj_type, 0); commit; end; BEGIN insert into SCOTT.SHOW_DEPENDENCY_TREE(SerialNo, obj_name, Obj_type, Obj_level, dep_obj_name, dep_obj_type, owner) SELECT ROWNUM, obj_name, obj_type, level, LPAD(' ', (LEVEL-1)*7)||dep_obj_name dep_obj_name, dep_obj_type, OWNER from (select distinct obj_name, obj_type, dep_obj_name, dep_obj_type, OWNER from SCOTT.SHOW_DEPENDENCY_TBL) start with UPPER(obj_name) = UPPER(gv_obj_name) --start with rownum = 1 connect by prior UPPER(dep_obj_name) = UPPER(obj_name); COMMIT; EXCEPTION WHEN OTHERS THEN NULL; END; commit; end; end; /

Note: The code should be input with object owner, object name, Object type. Last input parameter value is zero 0 which is of no use now and soon be eliminated. The code is session specific due to some technical constraint. This empowers the code to be used by concurrent multiple user with a cons that it is session specific, means, if you run the code for a given object in a session, result can be seen only through that session. The result is powered with level through with which the object is referenced In hierarchical model Below is the way by which code can be executed for a given table BEGIN DEPS_USES.Show_deps(OBJECT_OWNER, OBJECT_NAME, OBJECT_TYPE, 0); END; / After successful execution of the code, below select statement needs to be executed to see the result: SELECT * FROM SHOW_DEPENDENCY_TREE;

*/ -----------------------------------------------------------EXAMPLE-----------------------------------------------------------CONN SCOTT/TIGER@dwdev1; SET LINES 1500 /* BEGIN DEPS_USES.Show_deps(OBJECT_OWNER, OBJECT_NAME, OBJECT_TYPE, 0); END; / SELECT * FROM SCOTT.SHOW_DEPENDENCY_TREE; eg. */ ---------------BEGIN DEPS_USES.Show_deps('SCOTT', 'V_RECORDED_REVENUE_DELTA', 'VIEW', 0); END; /

SELECT * FROM SCOTT.SHOW_DEPENDENCY_TREE; ---------BELOW ARE WAYS TO CAN USE THIS FUNCTIONALITY-----/* BEGIN DEPS_USES.Show_deps('SCOTT', 'SP_POP_BI_PNL_FACT', 'PROCEDURE', 0); END; / SELECT * FROM SCOTT.SHOW_DEPENDENCY_TREE; ---------------BEGIN DEPS_USES.Show_deps('SCOTT', 'SCOTT_PKG_INSERT_STG1', 'PACKAGE BODY', 0); END; / SELECT * FROM SCOTT.SHOW_DEPENDENCY_TREE; */ ---------------/* select * from all_objects where Object_name like or object_name like '%SHOW_DEPENDENCY_TREE%' or object_name like '%DEPS_USES%' */ '%SHOW_DEPENDENCY_TBL%'

Pankaj Kumar Garg AWC Softwares Noida 999901245

S-ar putea să vă placă și