不过是Oracle还是SQL Server,在数据库软件安装和数据库创建的时候,都会自动创建一大堆表以及其他诸如视图、函数、存储过程之类的对象。这些系统级的表包含的是实例和实例所用到的物理和逻辑属性的元数据,Oracle把这些表统称为数据字典(data dictionary),在SQL Server中则是称为系统表(system tables)。
在SQL Server 2005及之后的版本,大部分的系统对象都保存在resource数据库中,少部分保存在master数据库中。Oracle中,数据字典表是保存在SYSTEM和SYSAUX表空间中。从SQL Server 2005开始是无法再直接访问系统表了,目录视图(catalogue views)取代系统表作为新的访问系统元数据的统一的接口。在Oracle中数据字典表名都是加密过的,藉此来减少表被直接访问或修改,同样的,Oracle也创建了一系列的视图用于给DBA和开发人员访问元数据,Oracle称这些视图为数据字典视图(data dictionary views)。
目录视图的定义存储在SQL Server的resource数据库中,这些系统视图归属于一个特别的名为sys的用户架构之下(user schema)并能从任意数据库中访问到。例如,要查看一个SQL Server实例中存在的所有的数据库,DBA就可以在任意数据库下使用下面语句查询:
1 | SELECT
* FROM
sys.databases |
要查出任意一个数据库中的所有对象,则可以使用sys.objects目录视图:
1 | SELECT
* FROM
sys.objects |
Oracle中,数据字典从属于Oracle用户SYS。不过不同于SQL Server的时候每个数据字典视图都存在有三种不同的形式,分别提供三个不同级别的信息。数据字典视图也就存在三个不同的类型,从视图名的前缀就能看出视图能带来什么样的信息:
- 以USER_开头的视图允许用户查看他自己创建的对象的信息。
- 以ALL_开头的视图允许用户查看他自己创建的对象以及那些非他自己创建的却有权限访问的对象的信息。
- 以DBA_开头的视图是给DBA用的,这类的视图可以查询到数据库中存在的所有对象的信息,普通的用户是没有权限访问这些视图的。
下面的例子展示的两个查询返回的结果就是不一样的:
1 | SELECT
TABLE_NAME, TABLESPACE_NAME FROM
USER_TABLES; |
2 | SELECT
TABLE_NAME, TABLESPACE_NAME FROM
DBA_TABLES; |
第一个只显示执行查询的用户自己创建的表而第二个则会显示数据库中存在的所有的表。