Oracle中的数据字典

来源:互联网 发布:ubuntu vim安装 编辑:程序博客网 时间:2024/05/18 21:50
原文地址:Oracle中的数据字典作者:成全地带
 今天在项目中遇到了一点小问题,需要判断某一用户名下某一表是否存在。在网上搜到了一个方法:
   select* from user_tables where table_name = 'TableName';
经实验果然好用,解决问题!Oracle不愧为数据库方面的老大,它提供的数据字典功能强大,且符合用户要求!现将数据字典中一些常用的视图功能贴出来,以备交流和使用。
我们创建的对象可以从"USER_"开通的视图中查看。如果在模式中创建了10张表,那么从USER_TABLES中查询将返回10行,每一行是关于一张表的特性信息
USER_TABLES不能查看非当前用户模式下创建的表。
ALL_TABLES视图不但显示当前用户模式下创建的表,而且显示授权能够访问的表信息

我们关心的视图以下列前缀命名:
  ·USER_ 当前用户模式下创建的对象
  ·ALL_  当前用户模式下创建的对象加上当前用户能访问的其他用户创建的对象。ALL视图常常包含一个"OWNER"列,反映出能够访问的对象的所有者。在USER_TABLES表中不能看到OWNER列是因为你就是在这个视图中所有表的所有者;在ALL_TABLES中有一个OWNER字段。
  ·DBA_  它提供了整个数据库的信息。包括数据库中所有表的名字和拥有者——包括SYS模式下的基本表
这些前缀在限制我们想看到的、需要看到的、应当被允许看到的范围上是一个帮助。查看当前模式下创建的表,查询USER_TABLES;
查看所有我们创建的表以及被授权可以从其他用户模式下访问的表,查询ALL_TABLES;
具有DBA或SELECT_CATALOG_ROLE角色的用户可以查询DBA_TABLES来查询数据库中所有表的列表;

不是所有视图下都有一个USER、ALL、和DBA前缀,有一些视图仅存在于dba视图范围。比如:DBA_DATA_FILES。
在开发环境中有时会访问DBA视图,允许开发人员探究Oracle数据字典是没有害处的。你可以在不拥有DBA角色的情况下获得这个权限。一般,把CONNECT和RESOURCE角色给应用开发者,他不能访问这些,你可以把SELECTANYTABLE权限或SELECT_CATALOG角色赋给一个用户,这样他将被允许访问整个数据字典。
一个人对数据字典理解的越多,越能接触到数据库中复杂的操作,越能对SQL语句优化敏感。

2、数据字典视图:概要
在数据字典视图中有一些隐含的关系。发现这些关系常常是使用SQL查询对数据字典验证的结果,幸运的是,在数据字典中有许多使用名称的特征。
例如:USER_TABLES表中每一个表包含一个单独的行。每一行包含一张表的详细信息,比如表的物理存储参数。这些数据提供的扩展信息告诉你表是怎么增长的。
USER_TAB_COLUMNS视图中在USER_TABLES表中的每一张表的每一行包含一条记录。如果一张表有10个字段,那么,你将在USER_TAB_COLUMNS表中找到10行记录,是关于每一字段的详细信息。比如字段数据类型。字段名TABLE_NAME在USER_TABLE和USER_TAB_COLUMNS表中都有,因此可以很容易的把他们连接起来。

USER_OBJECTS  用户对象视图
ALL_OBJECTS   所有对象视图
DBA_OBJECTS   DBA对象视图

USER_SEQUENCES  用户序列对象视图,在USER_SEQUENCES的记录也会出现在USER_OBJECTS表中

3、约束视图
有两个数据字典视图提供了约束的详细信息。USER_CONSTRAINTS和USER_CONS_COLUMNS.
一张表可能有也可能没有约束,对于一张表的每一个约束在USER_CONSTRAINTS中都有一条记录描述这个约束。包括约束应用到的表名称。如果你知道约束名想知道约束类型,查询USER_CONSTRAINTS表。这个视图描述了约束的定义。它不提供约束定义在哪些字段名称上。
在USER_CONS_COLUMNS视图中显示约束的字段名称。如果主键是个联合主键,这个视图中将有这个约束的两条记录。联合主键的每一个字段对应一条记录。每一条记录通过POSITION(在联合主键中的位置)来区别。

USER_CONSTRAINTS 和USER_CONS_COLUMNS都有字段CONSTRAINT_NAME和TABLE_NAME.
---------------------------------------------------------------------
USER_CONSTRAINTS                    USER_CONST_COLUMNS
---------------------------------------------------------------------
 CONSTRAINT_NAME                     CONSTRAINT_NAME
 CONSTRAINT_TYPE                     TABLE_NAME
 TABLE_NAME                          COLUMN_NAME
                                     POSITION

***********************************************************************

***********************************************************************

Oracle 数据字典结构

6.2 Oracle数据字典的结构

Oracle数据字典拥有多个等级。您将交互使用的等级是一连串的视图(由SYS账户所拥有),这些视图设计得非常容易使用。(一些人可能会对语句产生疑问,但是一旦将这些视图与字典中内在的表进行比较后,它是非常明显的)。非常明确地对所有这些字典视图及它们的列进行了命名,代表它们的内容。几乎所有通过数据字典的直接交互都将使用这些视图。
 
 说明:
  从历史的观点上说,SYS账户拥有所有数据字典视图及其内在表。这通常是真实的,但是,在将新的功能加入到OracleRDBMS中的时候,已经在一些其他特殊模式,如CTXSYS中创建了一些字典对象。
  这些字典视图定义在一连串的至少可以称为隐藏的内部表上。设计出这些表仅供在Oracle中维护数据库管理系统的开发人员使用。在从我们的意识中永远地消除这些概念之前,我们将学习一个示例。下面的查询说明了在数据库中检索关于表的信息的几种方式。要想这样做,需要查询字典视图,如USER_TABLES。下面是在数据字典中定义USER_VIEWS的方法:
  select o.name, v.textlength,v.text, t.typetextlength, t.typetext,
  t.oidtextlength, t.oidtext,t.typeowner, t.typename,
  decode(bitand(v.property,134217728), 134217728,
  (select sv.name from superobj$h, obj$ sv
  where h.subobj# = o.obj# andh.superobj# = sv.obj#), null)
  from sys.obj$ o, sys.view$ v,sys.typed_view$ t
  where o.obj# = v.obj#
  and o.obj# = t.obj#(+)
  and o.owner# =userenv('SCHEMAID')
     在该示例中,我们着眼于USER_VIEWS,而不是USER_TABLES,因为该视图定义只有9行——USER_TABLES将近有80行难于理解的对数据字典附属表的说明。通过该示例,很容易理解提供更多易用视图的原因。让我们把不愉快的事情放在一边,回来学习更加有用的字典视图。当发布了针对USER_TABLES查询的时候,它通过整体进行了转化,80行的视图定义表现出一种能够轻易理解的形式。
  尽管不是一个严格的规则,但可以将字典视图考虑分成五个种:
  (1)首先是描述由发布查询的用户直接拥有的视图组。这些视图的名称由USER_作为前缀。少数USER_视图没有显示所拥有的对象,因为它们引用涉及到整个数据库的对象,而不是单独的用户模式。例如,USER_USERS给了一些关于数据库其他用户的基本信息。
  (2)第二组的视图由ALL_作为前缀,并且显示包括在USER_视图内的所有对象信息,以及那些可以访问基于其他用户账户允许的视图。
  (3)另外一组视图提供了了解数据库中所有关于对象信息的方法,而不考虑所有者。这些视图打算由数据库管理员使用,因此前缀为DBA_。
  (4)所提供的第四组字典视图与ANSI标准的字典访问相兼容。大多数Oracle程序员及管理员使用前三组视图,而忽略了第四组视图,这种视图提供了较少的信息。但是,如果您通过多个RDBMS进行工作,并且需要对它们的字典进行稳定的访问,就应该知道这点。
  (5)最后一组数据字典对象不是指由大多数用户或者普通程序发起的直接访问。1,000视图(称为固定视图)拥有以V$或者GV$为开头的名称。(当GV$视图在Real ApplicationClusters数据库环境中提供所有实例的全局视图时,V$视图提供了关于被连接的实例信息)。监视及调整工具与由系统DBA开发的SQL脚本一起,通常将从这些V$及GV$视图中进行选择。没有访问这些工具的程序员会在诸如V$SQLAREA及V$SYSSTAT之类的V$及GV$视图中发现有用的调整信息。(对这些视图的访问默认受到了限制,所以程序员通常必须在他们能够看到该信息之前,允许DBA发布SELECTANYDICTIONARY系统特权)。另外一组几百个特殊字典视图,由V_$作为名称开始,即使是由DBA发布的,也很少直接使用。与在数据字典内部定义物理表不同,这些视图在各种动态“表”的顶部创立,这些“表”根本不是实际的表。这些结构以X$前缀作为名称开始,并且在OracleSGA内部绘制存储结构。为了允许通过SQL的SELECT语句的访问,将其看作X$表。这样允许在Oracle数据库内部,SQL用作为所有结构的单独且一致的接口,包括用户创建的及系统定义的。
  当发现程序员如何利用包含在数据字典内部的信息之前,有一个来自于这些视图种类中每个种类的示例。简单的SELECT将针对每个种类的实例进行发布,在返回并且描述的可用信息的行中观察其不同性。简而言之,我们不会对这些视图中的所有列进行说明,只有少数列说明了每个视图给出了整个可用信息的不同子集。
  6.2.1  USER_TABLES

  因为USER_字典视图显示了关于连接用户所拥有的对象信息,我们首先必须连接到一个拥有一些对象用户的模式;在该示例中,我们将使用SCOTT模式。与显示关于每个表的信息的所有47列的信息不同的是,我们将仅返回表的名称以及其存储在其中的表空间两列。图6-1说明了SCOTT模式拥有4个表。
  


  

图6-1  SCOTT模式拥有的表


  6.2.2  ALL_TABLES

  ALL_TABLES视图说明了允许当前用户访问的所有表。为了说明与USER_TABLES的区别,需要先连接HR用户,并且允许SCOTT用户或者HR表上更多的特权。现在,除SCOTT拥有的4个表之外,图6-2说明了SCOTT允许访问的HR所拥有的其他4个表。注意,尽管查询请求4个模式中的任何表,也不允许SCOTT访问OE或者SH所拥有的任何表,所以,在输出中不会出现任何信息。
  但是,在该特殊视图中没有说明的是实际上已经给出了特权SCOTT。要知道特权,SCOTT可以查询USER_TAB_PRIVS视图。
  


  

图6-2  SCOTT可见的HR所拥有的附加表


  6.2.3  DBA_TABLES

  为了对字典视图的第三个种类以及那些前缀为DBA_的视图进行说明,需要转换为另外一个用户。因为没有给定SCOTT所必须的DBA特权,如果由SCOTT进行查询,那么该视图将不会出现。因为DBA_TABLES视图显示整个数据库中的所有表,在图6-3中的查询将使用GROUPBY子句显示所有者的模式以及该模式中表的数量。
  


  

图6-3  DBA_TABLES显示所有模式中的表


  通过该用户查询,该视图能够看见所有来自于这四种特定模式的表。因为SYSTEM特权的状态,在个别对象上没有显式的GRANT特权能够看见甚至修改这些表。这是有潜在危险的,因为只要手指轻轻一划,就会毁灭数据库的整体性。因为该原因,DBA通常不给予开发人员DBA等级的特权,而给予他们工作所必须的特权。
  6.2.4  TAB

  第四个示例使用了一个“普通的”字典视图,该视图对Oracle而言不是唯一的。这些视图往往比相关的Oracle特定视图拥有较少的信息——特别是它们避免物理执行的细节问题。但是,如果您需要开发一个应用程序,该应用程序将访问由Oracle及其他RDBMS管理的多个数据库,它们是非常有用的。因为TAB视图仅拥有3个列,图6-4将简单地选择所有列及所有行。
  


  

图6-4  通过TAB视图进行选择


  注意由TAB视图返回的特定的行与Oracle的USER_TABLES视图是一样的。那些行的可用信息总量受到了更多的限制。
  6.2.5  V_$FIXED_TABLE

  通常,开发人员很少必须访问任何特定的字典视图,以及在最后的种类中出现的表。但是,为了说明该概念,我们需要作为有特权的SYSTEM用户进行反向连接。在直接响应已经检查过的相同信息的种类中没有视图,所以图6-5着眼于列出各种固定表的视图(那些带有X$前缀的视图允许您使用SQL看见数据库各种内部存储结构的内容)。
  


  

图6-5  查询V_$FIXED_TABLE显示内部数据字典结构


  为了避免返回数以百计的行,通过使用Oracle的ROWNUM伪列限制输出的行不超过5行。
  这5个查询仅提供了几个不同类型的字典视图。还有许多其他的查询为数据库的每个方面提供信息。我们将在本章的其余部分参考几个其他的查询,但是仅能了解一些表面情况。读者需要的大多数字典视图的命名是有意义的。(即使是非直观地)。作为数据字典视图的完整列表,需要在Oracle参考手册中(不是SQL参考手册)查找您正在使用的Oracle服务器版本,Oracle Technology Network在线可用网址为:http://otn.oracle.com。
  通常,您或许正工作在与自己的Oracle数据字典相结合的环境中。现在,拥有了数据字典结构的概念,您可以思考在开发进程中利用这种资源帮助自己。
原创粉丝点击