`
sjk2013
  • 浏览: 2187351 次
文章分类
社区版块
存档分类
最新评论

查找当前用户的所有数据库对象的依赖关系

 
阅读更多

1.我们查看数据库对象依赖关系一般是用dba_dependencies视图来查看。

这里我们使用对象依赖树utldtree来查看.

首先建立依赖关系表:

CREATE TABLE OB_DEP(owner varchar2(20),--用户名

                       type varchar2(30), --对象类型,如表、存储过程、函数等

                       name varchar2(200), --对象名称

                       DEPDESC varchar2(2000)--依赖关系

                                               );


然后安装utldtree包(对象依赖树)

SQL> @F:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\utldtree.sql

先测试一下:

--查看存储deptree_fill结构:
SQL> desc deptree_fill
PROCEDURE deptree_fill
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 TYPE                           CHAR                    IN
 SCHEMA                         CHAR                    IN
 NAME                           CHAR                    IN

SQL> SET SERVEROUTPUT ON
SQL> exec deptree_fill('TABLE','SCOTT','EMP');

PL/SQL 过程已成功完成。

SQL> SELECT * FROM IDEPTREE;

DEPENDENCIES
-----------------------------------------------
   PACKAGE BODY SYS.EMP_TEST
   FUNCTION SYS.TEST
   PROCEDURE SYS.UPD_SHIPDATE
TABLE SCOTT.EMP

------------------------
--IDEPTREE视图即保存了用户SCOTT的表EMP所依赖的对象(emp_test包、test函数、UPD_SHIPDATE过程)



现在我们来建立存储过程实现将当前用户的所有数据库对象插入到先前建立的依赖关系表中,存储过程如下:

  -- 寻找数据库所有对象的依赖关系
  CREATE OR REPLACE PROCEDURE DEPEND_RELATIONSHIP AS
  -- 定义第一个游标从Dba_Objects取用户、对象类型、对象名称
  CURSOR CUR_OBJECT IS
    SELECT OWNER, OBJECT_TYPE, OBJECT_NAME FROM USER_OBJECTS;

  CUR01 CUR_OBJECT%ROWTYPE;

  -- 定义第二个游标从依赖树表中取依赖信息
  CURSOR CUR_DEP IS
    SELECT DEPENDENCIES FROM IDEPTREE;

  CUR02 CUR_DEP%ROWTYPE;

  --定义保存第一个游标的值的各个变量
  V_OWNER DBA_OBJECTS.OWNER%TYPE;
  V_TYPE  DBA_OBJECTS.OBJECT_TYPE%TYPE;
  V_NAME  DBA_OBJECTS.OBJECT_NAME%TYPE;

  V_DEPDESC OB_DEP.DEPDESC%TYPE;

BEGIN

  V_DEPDESC := '';
  SELECT USER INTO v_owner FROM dual; --获取当前用户名
  --打开游标CUR_OBJECT取用户、对象类型、对象名称
  OPEN CUR_OBJECT;
  LOOP
  
    FETCH CUR_OBJECT
      INTO CUR01;
    EXIT WHEN CUR_OBJECT%NOTFOUND;
    
    V_TYPE  := CUR01.OBJECT_TYPE;
    V_NAME  := CUR01.OBJECT_NAME;
  
    DEPTREE_FILL(V_TYPE, V_OWNER, V_NAME);
  
    -- 打开游标CUR_DEP,插入依赖信息
    OPEN CUR_DEP;
    LOOP
      FETCH CUR_DEP
        INTO CUR02;
      EXIT WHEN CUR_DEP%NOTFOUND;
      --获取依赖信息,有依赖关系的都是多条数据,没有依赖关系就是一条(它自己本身)
      V_DEPDESC := CUR02.DEPENDENCIES;
    
      INSERT/*+append */ INTO OB_DEP VALUES (V_OWNER, V_TYPE, V_NAME, V_DEPDESC);
    
    END LOOP;
    CLOSE CUR_DEP;
  
  END LOOP;
  CLOSE CUR_OBJECT;

  COMMIT;

  --出错处理
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Error Occur:' || SQLCODE || ' ' || SQLERRM);
    ROLLBACK;
  
END DEPEND_RELATIONSHIP;


---------------------

请注意:当数据库对象非常多的时候(大概超过2000个),执行该存储过程会很慢。

分享到:
评论

相关推荐

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    最明显的就是类似于LAST_UPDATE_TIME了,通常为了保证这个字段的一致性,通常在插入新记录时采用当前数据库时间作为字段值。但IBatisNet接收的实体类对象属性都是普通C#类型,并不具备传入表达式的能力。如果采用...

    2数据库实习-学生信息管理系统.doc

    1 序言 在科技不断发展的今天,计算机科学技术的不断提高和日渐成熟,其强大的功能已为 人们深刻认识,它...这在很大程度上取决于设计者的洞察力和创造性 ,以及对设计对象掌握得透彻程度,当然它还依赖于设计工具和方

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    说明:断开与当前数据库的连接并会退出 用法:exit 6. 编辑脚本(edit/ed) 说明:编辑指定或缓冲区的sql脚本 用法:edit [文件名] 列子: 7. 运行脚本 (start/@) 说明:运行指定的sql脚本 用法:start/@ 文件名 ...

    网管教程 从入门到精通软件篇.txt

     bootcfg /scan 扫描用于 Windows 安装的所有磁盘并显示结果。  注意:这些结果被静态存储,并用于本次会话。如果在本次会话期间磁盘配置发生变化,为获得更新的扫描,必须先重新启动计算机,然后再次扫描磁盘。...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    AppFramework_V1.0

    最明显的就是类似于LAST_UPDATE_TIME了,通常为了保证这个字段的一致性,通常在插入新记录时采用当前数据库时间作为字段值。但IBatisNet接收的实体类对象属性都是普通C#类型,并不具备传入表达式的能力。如果采用...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    8.6.2 用户定义聚合函数(UDA,User Defined Aggregate) 8.6.3 专用解决方案 8.7 直方图(Histogram) 8.8 分组因子 8.9 分组集 8.9.1 样例数据 8.9.2 GROUPING SETS从属子句 8.9.3 CUBE从属子句 8.9.4 ...

    超级有影响力霸气的Java面试题大全文档

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...

    AppFramework_V1.0_New

    最明显的就是类似于LAST_UPDATE_TIME了,通常为了保证这个字段的一致性,通常在插入新记录时采用当前数据库时间作为字段值。但IBatisNet接收的实体类对象属性都是普通C#类型,并不具备传入表达式的能力。如果采用...

    基于bmob的校园app设计.doc

    针对当前缺少兼职信息展示的现象,文中编写了兼职信息展示的功能,在有了通讯录之后,查找老师的联系方式也就更便捷,经过学号认证后,用户还可以在APP中修改个人基本资料。 本文经过系统需求分析、设计、编码实现等...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例014 使当前项目依赖另一个项目 21 1.3 界面设计器 22 实例015 安装界面设计器 22 实例016 设计Windows系统的运行对话框 界面 23 实例017 设计计算器程序界面 26 实例018 设计关于进销存管理系统的界面 27 第2章 ...

    学籍管理系统软件设计说明书

    在数据库中找到所有此年级的人员名单、学号、性别、出生年月、专业和准考证号。 3.5.5 输出 学号、人员名单、性别、出生年月、专业和准考证号的内容 3.6 功能需求(六) 3.6.1 规格说明 查询一个班级的相关信息...

    基于J2EE框架的个人博客系统项目毕业设计论...

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    SQL培训第一期

    用于操作关系型数据库对象内部的数据,insert、update、delete。 1.2.3 数据定义语言(DDL) 用来建立及定义数据表、字段以及索引等数据库结构,create、alter、drop 。 1.2.4 数据控制语言(DCL) 用于控制对数据库...

    Sosoo 1.0网络爬虫程序.doc

    通过上述对功能的定制,我们可以看到在应用中我们对sosoo的编程接口并不多,而且目前系统都是基于set的方式注入aop注入对象,这样很容易和spring等基于set方式的依赖注入(IOC)框架集成。 1.Roboter类,spider...

    微软活动目录管理管理简明手册

    而如果活动目录中的资源对应的是LDAP标识,那么只需要DNS中有这个标识的定位记录就可以很方便地供用户查找资源,并寻址到相应的位置上。' u* [+ L2 m- \ j: h: L. r7 u 有关DNS服务器的配置,读者可以参考《电脑报...

Global site tag (gtag.js) - Google Analytics