第10章 基本数据库对象管理
无论是数据库管理员,还是普通用户,都需要经常对数据库对象进行管理,如数据库对象的创建、删除、修改等。Oracle中的数据库对象包括表、索引、视图、存储程序、序列等,这些数据库对象以一种逻辑关系组织在一起,这就是模式(schema)。
模式是一个用户所拥有的所有数据库对象的集合。每个数据库对象都属于某个用户,一个用户所拥有的数据库对象就组成了一个模式,模式的名称与用户名相同。当创建用户时,就同时产生了一个模式,在默认的情况下,用户在自己的模式中有所有的权限。
在第1章中,我们已经详细介绍了基本数据库对象的用法,只是当时是站在普通用户的角度,以一种通用的方式介绍它们的用法的。在本章中,我们将站在数据库管理员的角度,重新考虑这些数据库对象在Oracle中所涉及的特性,如存储结构、数据的组织方式等。
10.1 表的管理
表的管理涉及表的结构、表的创建、修改与删除等操作,以及临时表、分区表和索引组织表三种特殊类型的表。
10.1.1 表的结构
在数据库中,表是最基本的数据库对象,用来存储系统或用户的数据。表中的数据是按照行和列的格式存放的。表中的各行数据一般以写入的先后顺序存放,而一行中的各列一般按照定义表时指定的顺序存放的。
在逻辑结构上,一个表位于某个表空间。当创建一个表时,将同时创建一个表段,用于存放表中的数据。在物理结构上,表中的数据都存放在数据块中,因而在数据块中存放的是一行行的数据。图10.1为数据块中一行数据的结构。
图 10.1 行的结构
其中行的头部记录了该行中列的个数、行间的全连接、加锁信息等。列长度记录一个列实际占用的字节数,而列值则记录了该列实际存放的数据。
表中的每一行数据都有一个行号,用于标识该行数据的物理位置。根据这个行号,可以直接定位该行数据。行号可以通过伪列ROWID获得。例如,以下查询得到表DEPT中的数据及每行的行号。
SQL>SELECT ROWID, DEPTNO, DNAME, LOC FROM DEPT;
ROWID DEPTNO DNAME LOC
AAABhdAABAAAFuKAAA 10 ACCOUNTING NEW YORK
AAABhdAABAAAFuKAAB 20 RESEARCH DALLAS
AAABhdAABAAAFuKAAC 30 SALES CHICAGO
AAABhdAABAAAFuKAAD 40 OPERATIONS BOSTON
行号是由数据库服务器自动生成的字符串,包含18个字符。行号的组成如图10.2所示。
图 10.2 行号的组成
其中前六个字符表示数据库对象的编号,用来指定该行数据属于哪个数据库对象。在数据库中每个数据库对象都有一个唯一的编号。
从第七个到第九个共三个字符表示数据文件的相对编号,用来指定该行数据存储在哪个数据文件中。在数据库中每个数据文件中有两个编号,一个是绝对编号,它是数据文件在整个数据库范围内的编号,另一个是相对编号,它是数据文件在一个表空间范围内的编号。
从第十到第十五共六个字符表示数据块的编号,用来指定该行数据位于哪个数据块中。
最后三个字符表示行号,用来指定该行数据在数据块中位于第几行。为了使用户对行号的进行解析,Oracle提供了一个DBMS_ROWID程序包,利用这个程序包中的函数可以对行号进行分析。DBMS_ROWID中各个函数的用法如表10.1所示。
例如,以下查询将得到dept表中每行数据所在的文件编号、数据库对象的编号、数据块编号和在数据块中的行号:
SQL>SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)AS相对文件号,
DBMS_ROWID.ROWID_OBJECT(rowid)AS对象编号,
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)AS数据块编号,
DBMS_ROWID.ROWID_ROW_NUMBER(rowid)AS行号
FROM dept;