在手工建库完成之后,即通过create database建立了数据库启动到open状态,数据库是不存在数据字典的,需要创建数据库的数据字典。这个时候就要通过数据库脚本来创建数据字典表。
数据字典表都是一些只读的表,可以通过数据字典表去查询创建相关对象的信息,比如创建一张表,这张表里面有什么字段,表叫什么名字,这些等信息要通过数据字典表来查询到。
数据字典表对于用户来说是只读的,是由oracle来自动维护的,对于DDL操作数据库会自动完成数据字典表的维护。
创建数据字典表主要是跑三个脚本,前面两个脚本是用sys用户来跑的,最后一个脚本是system用户来跑。
@是代表运行脚本,?代表是oracle_home($ORACLE_HOME)
[oracle@Database2 db_1]$ find /u01 -name catalog.sql
/u01/app/oracle/product/11.2.0/db_1/rdbms/admin/catalog.sql
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
@?/sqlplus/admin/pupbld.sql (SYSTEM用户执行)
上面这些脚本跑完了,默认是没有Scott这个用户的,还需要跑@?/rdbms/admin/utlsampl
SQL> @?/rdbms/admin/utlsampl
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@Database2 ~]$ sqlplus scott/tiger
SQL> desc user_tables; --这个数据字典是当前用户拥有的对象的信息
Name Null? Type
----------------------------------------- -------- ----------------------------
TABLE_NAME NOT NULL VARCHAR2(30)
TABLESPACE_NAME VARCHAR2(30)
CLUSTER_NAME VARCHAR2(30)
IOT_NAME VARCHAR2(30)
STATUS VARCHAR2(8)
SQL> select TABLE_NAME,TABLESPACE_NAME from user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
DEPT SYSTEM
EMP SYSTEM
BONUS SYSTEM
SALGRADE SYSTEM
SQL> select owner,table_name,tablespace_name from dba_tables where owner='SCOTT';
select owner,table_name,tablespace_name from dba_tables where owner='SCOTT'
*
ERROR at line 1:
ORA-00942: table or view does not exist
可以看到出现错误了,dba_tables是只能sys用户访问,Scott用户是访问不了这个数据字典表的。(普通用户是不可以访问dba打头的数据字典表)
SQL> conn / as sysdba
Connected.
SQL> set linesize 1200;
SQL> select owner,table_name,tablespace_name from dba_tables where owner='SCOTT';
OWNER TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
SCOTT DEPT SYSTEM
SCOTT EMP SYSTEM
SCOTT BONUS SYSTEM
SCOTT SALGRADE SYSTEM
三种数据字典,按照查询信息的范围可以分为下面三种 USER <ALL <DBA
也就是说以user开头的是查看当前用户拥有的对象信息,all开头的就是这个用户有权限访问的对象信息,包括自己可以访问还有别人授权访问的,dba就是整个数据字典表所有的对象的信息。
整个建库过程参考前面两篇文章:Oracle 手工建库第一步 创建instance -->Oracle 手工建库第二步 创建databse