Oracle 数据字典
Oracle数据库字典介绍
Oracle数据字典是有表和视图组成的,存储有关数据库结构信息的一些数据库对象。数据库字典描述了实际数据是如何组织的。对它们可以象处理其他数据库表或视图一样进行查询,但不能进行任何修改。
Oracle数据库字典通常是在创建和安装数据库时被创建的,Oracle数据字典是Oracle数据库系统工作的基础,没有数据字典的支持,Oracle数据库系统就不能进行任何工作。
在Oracle数据库字典中,许多视图都有三个不同的实例,它们的前缀分别为"USER_"、"ALL_"及"DBA_"。"USER_"为前缀的数据库字典视图通常记录执行查询的帐户所拥有的对象的信息,"ALL_"为前缀的数据库字典视图通常记录包括执行查询的帐户所拥有的对象的信息及授权至PUBLIC的帐户用户所拥有的对象的信息,"DBA_"为前缀的数据库字典视图则包含所有数据库对象的信息,而不管其所有者。其他的字典视图中主要的是V$视图,之所以这样叫是因为他们都是以V$或GV$开头的。V$视图是基于X$虚拟视图的。V$视图是SYS用户所拥有的,在缺省状况下,只有SYS用户和拥有DBA系统权限的用户可以看到所有的视图,没有DBA权限的用户可以看到USER_和ALL_视图,但不能看到DBA_视图。与DBA_,ALL,和USER_视图中面向数据库信息相反,这些视图可视的给出了面向实例的信息。
在Oracle的绝大多数数据字典视图中都有象DBA_TABLES,ALL_TABLES和USER_TABLES这样的视图家族。Oracle中有超过100个视图家族,下表列出了最重要和最常用的视图家族,需要注意的是每个视图家族都有一个DBA_,一个ALL_一个USER_视图。
视图家族
描述
COL_PRIVS
包含了表的列权限,包括授予者、被授予者和权限
EXTENTS
数据范围信息,比如数据文件,数据段名(segment_name)和大小
INDEXES
索引信息,比如类型、唯一性和被涉及的表
IND_COLUMNS
索引列信息,比如索引上的列的排序方式
OBJECTS
对象信息,比如状态和DDL time
ROLE_PRIVS
角色权限,比如GRANT和ADMIN选项
SEGMENTS
表和索引的数据段信息,比如tablespace和storage
SEQUECNCES
序列信息,比如序列的cache、cycle和ast_number
SOURCE
除触发器之外的所有内置过程、函数、包的源代码
SYNONYMS
别名信息,比如引用的对象和数据库链接db_link
SYS_PRIVS
系统权限,比如grantee、privilege、admin选项
TAB_COLUMNS
表和视图的列信息,包括列的数据类型
TAB_PRIVS
表权限,比如授予者、被授予者和权限
TABLES
表信息,比如表空间(tablespace),存储参数(storage parms)和数据行的数量
TRIGGERS
触发器信息,比如类型、事件、触发体(trigger body)
USERS
用户信息,比如临时的和缺省的表空间
VIEWS
视图信息,包括视图定义
在Oracle中还有一些不常用的数据字典表,但这些表不是真正的字典家族,他们都是一些重要的单一的视图。这些视图见下表:
视图名称
描述
USER_COL_PRIVS_MADE
用户授予他人的列权限
USER_COL_PRIVS_RECD
用户获得的列权限
USER_TAB_PRIVS_MADE
用户授予他人的表权限
USER_TAB_PRIVS_RECD
用户获得的表权限
Oracle数据库字典的应用
借助Oracle数据字典,利用Oracle的DDL语句,我们可以做很多事情,几乎所有的Oracle开发辅助工具都是利用这一点进行设计的。作者将通过如何取得数据库表字段信息来说明。
首先我们定义一个数据库表,数据库表结构如下:
数据库表名[TABLE_TEST]
字段名
数据类型
长度
缺省值
允许空
主键
注释
NAME
VARCHAR2
40
N
Y
姓名
SEX
VARCHAR2
1
'Y'
N
性别
BIRTHDAY
DATE
0
Y
生日
HEIGHT
NUMBER
3,1
Y
身高
WEIGHT
NUMBER
3,1
Y
体重
MEMO
BLOB
0
Y
备注
创建表的SQL语句如下
-- 创建数据表
create table TABLE_TEST
(
NAME varchar2(40) not null,
SEX varchar2(1) default 'Y' not null,
BIRTHDAY date not null,
HEIGHT number(3,2),
WEIGHT number(3,2),
MEMO blob
);
-- 给列添加备注
comment on column TABLE_TEST.NAME is '姓名';
comment on column TABLE_TEST.SEX is '性别';
comment on column TABLE_TEST.BIRTHDAY is '生日';
comment on column TABLE_TEST.HEIGHT is '身高';
comment on column TABLE_TEST.WEIGHT is '体重';
comment on column TABLE_TEST.MEMO is '备注';
-- 创建约束关系 主键 外键 其他
alter table TABLE_TEST add constraint TB_TEST_P_NAME primary key (NAME);
数据表创建完毕,执行下列SQL语句:
select
A.column_name 字段名,A.data_type 数据类型,A.data_length 长度,A.data_precision 整数位,
A.Data_Scale 小数位,A.nullable 允许空值,A.Data_default 缺省值,B.comments 备注
from
user_tab_columns A,user_col_comments B
where
A.Table_Name = B.Table_Name
and A.Column_Name = B.Column_Name
and A.Table_Name = 'TABLE_TEST'
我们可以得出一下结果:
字段名
数据类型
长度
整数位
小数位
允许空值
缺省值
备注
NAME
VARCHAR2
40
N
1<long>
2
3姓名
4
5SEX
6
7VARCHAR2
8
91
10
11
12
13
14
15N
16
17<long>
18
19性别
20
21BIRTHDAY
22
23DATE
24
257
26
27
28
29
30
31N
32
33<long>
34
35生日
36
37HEIGHT
38
39NUMBER
40
4122
42
433
44
452
46
47Y
48
49<long>
50
51身高
52
53WEIGHT
54
55NUMBER
56
5722
58
593
60
612
62
63Y
64
65<long>
66
67体重
68
69MEMO
70
71BLOB
72
734000
74
75
76
77
78
79Y
80
81<long>
82
83备注
84
85这样,我们在进行程序设计时,通过一条简单的SQL语句,然好通过Ole调用Word,便可为最终用户导出完整的数据库表字典文档。
86再执行下列SQL语句:
87select
88INDEX_NAME 索引名,INDEX_TYPE 索引类型,UNIQUENESS 索引类别
89from
90user_indexes
91where
92TABLE_NAME = 'TABLE_TEST'
93
94得到结果如下(注:SYS_IL0000031226C00006$$索引为系统在创建数据库表时自动创建的,用于数据库表内容的维护):
95
96
97
98索引名
99
100索引类型
101
102索引类别
103
1041
105
106SYS_IL0000031226C00006$$
107
108LOB
109
110UNIQUE
111
1122
113
114TB_TEST_P_NAME
115
116NORMAL
117
118UNIQUE
119
120
121
122执行下列SQL语句,我们将得到更多的关于数据库表结构的信息:
123select
124A.column_name 字段名,A.data_type 数据类型,A.data_length 长度,A.data_precision 整数位,
125A.Data_Scale 小数位,A.nullable 允许空值,A.Data_default 缺省值,B.comments 备注,
126C.IndexCount 索引次数
127from
128user_tab_columns A,
129user_col_comments B,
130(select count(*) IndexCount,Column_Name from User_Ind_Columns where Table_Name = 'TABLE_TEST' group by Column_Name) C
131where
132A.Table_Name = B.Table_Name
133and A.Column_Name = B.Column_Name
134and A.Column_Name = C.Column_Name(+)
135and A.Table_Name = 'TABLE_TEST'
136得到结果如下:
137
138字段名
139
140数据类型
141
142长度
143
144整数位
145
146小数位
147
148允许空值
149
150缺省值
151
152备注
153
154索引次数
155
156BIRTHDAY
157
158DATE
159
1607
161
162
163
164
165
166N
167
168<long>
169
170生日
171
172
173
174HEIGHT
175
176NUMBER
177
17822
179
1803
181
1822
183
184Y
185
186<long>
187
188身高
189
190
191
192MEMO
193
194BLOB
195
1964000
197
198
199
200
201
202Y
203
204<long>
205
206备注
207
208
209
210NAME
211
212VARCHAR2
213
21440
215
216
217
218
219
220N
221
222<long>
223
224姓名
225
2261
227
228SEX
229
230VARCHAR2
231
2321
233
234
235
236
237
238N
239
240<long>
241
242性别
243
244
245
246WEIGHT
247
248NUMBER
249
25022
251
2523
253
2542
255
256Y
257
258<long>
259
260体重
261
262
263
264
265
266当然Oracle数据字典的应用远不止这些,通过Oracle数据库字典的支持,我们可以得到Oracle数据库结构的所有信息,著名的数据库开发工具PL/SQL Developer完全就是基于Oracle的数据库字典实现的。作者也编写了一个自己的数据库设计工具,在Oracle数据库字典的基础上进行了一些扩充,如果感兴趣可以发邮件到[email protected]同作者联系。
267
268[注:作者上传好几次都上传不成功,不知道原来的是否还在]</long></long></long></long></long></long></long></long></long></long></long></long>