《Oracle数据库管理与维护实战》——2.11 Oracle数据字典-阿里云开发者社区

开发者社区> 数据库> 正文

《Oracle数据库管理与维护实战》——2.11 Oracle数据字典

简介:

本节书摘来自异步社区出版社《Oracle数据库管理与维护实战》一书中的第2章,第2.11节,作者: 何伟娜 , 常建功,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.11 Oracle数据字典

Oracle数据库管理与维护实战
数据字典内存放了Oracle的数据库信息,用户可以通过数据字典来查看这些信息。数据字典是只读的,它是Oracle数据库的最重要的部分之一,是由一组只读的表及其视图组成。数据字典可提供以下的信息。

Oracle用户的名字

每一个用户所拥有的权限和角色

数据库对象的名字(表、视图、快照、索引、聚集、同义词、序列、过程、函数、包及触发器等)

关于完整性约束的信息

列的缺省值

有关数据库中对象的空间分布及当前使用情况

审计信息(如谁存取或修改各种对象)

其它的一些数据库信息

Oracle中的数据字典有静态和动态之分。静态数据字典主要包含用户在访问数据字典时不会发生改变的信息。而动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内在信息,所以在访问这类数据字典时数据往往不是一成不变的,数据库管理员常从动态数据字典中获得数据的运行信息。接下来我们分别就这两类数据字典来论述。

2.11.1 静态数据字典

这类数据字典主要是由表和视图组成。应该注意的是,数据字典中的表是不能直接来访问的,但是可以访问数据字典中的视图。静态数据字典中的视图分为三类,它们分别为:USER、ALL、DBA_。

USER_视图存储了当前用户所拥有的对象的信息(即所有在当前用户模式下的对象)。

ALL_视图存储了当前用户能够访问的所有对象的信息。与USER相比,ALL并不需要拥有该对象,只需要有访问该对象的权限即可。

DBA_视图存储了数据库中所有对象的信息。当前用户必须具有访问这些数据库的权限才能访问,一般来说必须具有管理员权限。

三类视图之间的数据有重叠,它们之间除了因为访问权限不一样所以访问范围不一样之外,其他均具有一致性。具体来说,由于数据字典视图是由SYS(系统用户)所拥有的,在缺省情况下,只有SYS和拥有DBA系统权限的用户可以看到所有的视图。没有DBA权限的用户只能看到USER_和ALL_视图。如果用户没有被授予相关的SELECT权限,就不能看到DBA_视图的内容。举例来说,USER_USERS、ALL_USERS、DBA_USERS视图内放的都是有关用户的信息,USER_USERS内放的是用户名,用户状态,用户创建时间等信息,而ALL_USERS内放的是当前数据库内所有用户的用户名称和用户创建时间。DBA_USERS内描述的字段信息和USER_USERS一样,但显示所有用户的信息。三者一般同时出现,有USER_USERS就有DBA_USERS和ALL_USERS;同样,有USER_TABLES就有DBA_TABLES和ALL_TABLES等,只是范围不一样。

下面我们以USER_为例介绍几个常用的静态视图。

1.USER_USERS视图
该视图显示当前用户的信息,主要包括当前用户名、账户id、账户状态、表空间名、创建时间等。

2.USER_TABLES视图
该视图显示当前用户拥有所有表的信息,主要包括表名、表空间名、簇名等。通过此视图用户可以清楚了解当前用户可以操作的表。

3.USER_OBJECTS视图
该视图显示当前用户拥有的所有对象的信息,对象包括表、视图、存储过程、触发器、包、索引、序列等。该视图比USER_TABLES视图更加全面。例如,如需要获取一个名为“package1”的对象类型和其状态的信息,执行以下命令。

SQL>select object_type,status
from user_objects
where object_name=upper(‘package1’);

这里upper(一个PL/SQL内置函数)函数用来转换大小写,数据字典里的所有对象均为大写形式,而PL/SQL里不区分大小写,在实际操作中一定要注意大小写匹配。

4.USER_TAB_PRIVS视图
该视图显示当前用户对所有表的权限信息。

例如,为了了解当前用户对table1的权限信息,执行以下命令。

SQL>select * from user_tab_privs
where table_name=upper('table1')
了解了当前用户对该表的权限之后用户就可以清楚地知道,哪些操作可以执行,哪些操作不能执行。

2.11.2 查看各类静态对象

查看各类静态对象内容对分析Oracle的内部运行机制有十分重要的作用,有时开发人员也需要如何查看各类静态对象。下面我们将给出查看一些最常用对象的方法。

1.查看用户信息
查看当前用户的缺省表空间的代码如下。

SQL>select username,default_tablespace
 from user_users;

查看当前用户的角色的代码如下。

SQL>select *  from user_role_privs;

查看当前用户的系统权限和表级权限如下。

SQL>select * from user_sys_privs;
SQL>select * from user_tab_privs;

2.表
查看用户下所有的表的代码如下。

SQL>select * from user_tables;

查看名称包含log字符的表的代码如下。

SQL>select object_name,object_id
from user_objects 
where instr(object_name,'LOG')>0;

查看某表的创建时间的代码如下。

SQL>select object_name,created 
from user_objects
where object_name=upper('&table_name');

查看某表的大小的代码如下。

SQL>select sum(bytes)/(1024*1024) as "size(M)"
from user_segments 
where segment_name=upper('&table_name');

查看放在Oracle的内存区里的表的代码如下。

SQL>select table_name,cache
from user_tables
where instr(cache,'Y')>0;

3.索引
查看索引个数和类别的代码如下。

SQL>select index_name,index_type,table_name 
from user_indexes 
order by table_name;

查看索引被索引的字段的代码如下。

SQL>select * 
from user_ind_columns
          where index_name=upper('&index_name');

查看索引的大小的代码如下。

SQL>select sum(bytes)/(1024*1024) as "size(M)"
from user_segments 
where segment_name=upper('&index_name');

4.序列号
查看序列号,last_number是当前值的代码如下。

SQL>select * from user_sequences;

5.视图
查看视图的名称的代码如下。

SQL>select view_name
 from user_views;

查看创建视图的select语句如下。

SQL>set view_name,text_length 
from user_views;
SQL>set long 2000;  %说明:可以根据视图的text_length的值设定set long的大小
SQL>select text 
from user_views 
where view_name=upper('&view_name');

6.同义词
查看同义词的名称的代码如下。

SQL>select * from user_synonyms;

7.约束条件
查看某表的约束条件的代码如下。

SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
  from user_constraints
  where table_name = upper('&table_name');
SQL>select c.constraint_name,c.constraint_type,cc.column_name  
     from user_constraints c,user_cons_columns cc
     where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
     and c.owner = cc.owner and c.constraint_name = cc.constraint_name
     order by cc.position;

8.存储函数和过程
查看函数和过程的状态的代码如下。

SQL>select object_name,status from user_objects where object_type='FUNCTION';
SQL>select object_name,status from user_objects where object_type='PROCEDURE';

查看函数和过程的源代码如下。

SQL>select text from all_source where owner=user and name=upper('&plsql_name');

2.11.3 动态数据字典

Oracle包含了一些潜在的由系统管理员如SYS维护的表和视图,因为数据库运行时它们会不断进行更新,所以称为动态数据字典(或者是动态性能视图)。这些视图提供了关于内存和磁盘的运行情况,所以只能对其进行只读访问而不能修改。

Oracle中这些动态性能视图都是以v$开头的视图,比如v$access。下面我们就几个主要的动态性能视图进行介绍。

1.V$ACCESS视图
视图内描述了数据库中锁定的数据库对象以及访问这些对象的会话对象(session对象)。

2.V$SESSION视图
视图内描述了当前会话的详细信息。该视图字段较多。

3.V$ACTIVE_INSTANCE视图
视图内描述了当前数据库下活动实例的信息。

4.V$CONTEXT视图
视图内描述了当前会话的属性信息,比如命名空间、属性值等。

2.11.4 各类数据字典区分

Oracle中有多种数据字典,有ALL,USER,DBA,V$,GV$,V$,GV_$,X$。数据字典之间的关系比较复杂,前四种前面我们已介绍过,下面详细介绍后几种。

GV$视图是从Oracle 8开始引入的,G表示Global。除了一些特例以外,每个V$视图都有一个对应的GV$视图存在,如GV$FIXED_TABLE对应V$FIXED_TABLE视图。GV$视图出现在并行服务器(OPS)环境中。在并行服务器环境中,GV$视图返回的是所有实例信息;而V$视图则是在GV$视图的基础上,增加了实例ID判断后的结果,即每个V$视图都是在GV$视图中包含语句where inst_id = USERENV('Instance')而产生的,如图2-35所示。
image

V$、GV$实际上又是GV$,V$视图的同义词(图2-35中以‘=’号表示),V$,GV$是用下面SQL语句从GV$,V$视图中创建的。

SQL>create or replace view v_$nls_parameters as select * from v$nls_parameters;
SQL>create or replace public synonym v$nls_parameters for v_$nls_parameters;
SQL>grant select on v_$nls_parameters to public;

事实上,V$视图是真正的视图,V$视图是基于X$表直接建立的。

X$表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序动态创建。

2.11.5 动态数据字典结构

以后用户经常会用到动态数据字典,尤其是数据管理员。动态数据字典是管理员获取数据库信息的一个接口。图2-36、图2-37和图2-38给出动态数据字典的结构和分类,以帮助读者加深理解。

image

image

image

2.11.6  动态数据字典分类

Oracle数据库中保存了许多动态数据字典,为了便于用户掌握,这里专门对这些数据字典进行分类,表2-9给出一个数据字典分类表。

image
image
image
image
image

说明:“支持的数据库版本”列如果没有写出支持的版本,表示任何版本都支持。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章