读书笔记《Oracle Database Concepts 11g Release 2》(1)...

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 名称已由现有对象使用”.

读书笔记《Oracle Database Concepts 11g Release 2》(1)..._第1张图片

 

2.存储

oracle 的 schema 逻辑上存储在 tablespace 里, 但 schema 与 tablespace 之间并无直接关系, 一个 tablespace 可以存储多个 schema, 一个 schema 也可以存储在几个 tablspace 里. 物理实现上,每个 schema object 存储在一个或多个 data file 里.

读书笔记《Oracle Database Concepts 11g Release 2》(1)..._第2张图片

 

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 里存放非管理员信息的数据.

你可能感兴趣的:(oracle)