Schema(P31-P36)
1. 定义
Schema 是 oracle 中最基本的逻辑容器, 包括 tables,indexes,partitions,views,sequences,dimensions,synonyms(同义词),procedures,functions,packages 等都是 schema object.
注: 像 users, roles, contexts, directory objects 并不包含在 schema 里.
每个 oracle 用户都对应一个唯一的 schema, 这个 schema 包含着此用户的所有数据,每个数据以 schema object 的形式存在, 同一个 schema 内的对象名字必须唯一,所以在同一用户下,如果创建一个与某table同名的procedure 也会提示:”ORA-00955 名称已由现有对象使用”.
2.存储
oracle 的 schema 逻辑上存储在 tablespace 里, 但 schema 与 tablespace 之间并无直接关系, 一个 tablespace 可以存储多个 schema, 一个 schema 也可以存储在几个 tablspace 里. 物理实现上,每个 schema object 存储在一个或多个 data file 里.
3. 依赖关系
如果在 schema A 中引用了 schema B, 那么A是B的 dependent object, B是A 的 referenced object. 当一个 referenced object 发生变化时,其对应的所有 dependent都会被自动标记为 invalid.
(这里提到了一段说是会自动进行重新编译,但是看不明白” An invalid dependent object must be recompiled against the new definition of a referenced object before the dependent object is usable. Recompilation occurs automatically when the invalid dependent object is referenced. ”)
例:
-- 建立一个 table, 并在一个 procedure 里引用它 CREATE TABLE test_table ( col1 INTEGER, col2 INTEGER ); CREATE OR REPLACE PROCEDURE test_proc AS BEGIN FOR x IN ( SELECT col1, col2 FROM test_table ) LOOP -- process data NULL; END LOOP; END; 以下查询可以看出test_proc 是 valid 的 SQL> SELECT OBJECT_NAME, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'TEST_PROC'; OBJECT_NAME STATUS ----------- ------- TEST_PROC VALID
在新增一个column 后, test_proc 仍是 valid 的, 因为test_proc 与此新增字段并无依赖关系
SQL> ALTER TABLE test_table ADD col3 NUMBER; Table altered. SQL> SELECT OBJECT_NAME, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'TEST_PROC'; OBJECT_NAME STATUS ----------- ------- TEST_PROC VALID
但是如果修改 column col1 的数据类型, 则 test_proc 将会置为 invalid
SQL> ALTER TABLE test_table MODIFY col1 VARCHAR2(20); Table altered. SQL> SELECT OBJECT_NAME, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'TEST_PROC'; OBJECT_NAME STATUS ----------- ------- TEST_PROC INVALID 重新编译后, test_proc 变为 valid SQL> EXECUTE test_proc; PL/SQL procedure successfully completed. SQL> SELECT OBJECT_NAME, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'TEST_PROC'; OBJECT_NAME STATUS ----------- ------- TEST_PROC VALID
4. SYS 与 SYSTEM
安装 oracle 时会默认创建两个用户 SYS, STSTEM.
SYS 具有进行所有数据库操作的最高权限,SYS schema 中存储了有关 data directory 的所有基本表, 其内的仅由数据库进行操作,禁止任何其他用户进行修改.
SYSTEM 中存储了数据库管理,配置,工具产生的信息. 不要在 SYSTEM 里存放非管理员信息的数据.