发表于: 2005.02.04 22:06
分类: 读书笔记
出处: http://yangtingkun.itpub.net/post/468/17510
---------------------------------------------------------------
这一章Oracle介绍了对于所有对象或大部分对象都使用的管理语句。
CREATE SCHEMA语句:
Oracle包含一个CREATE SCHEMA语句,这个语句可以把建表、建立视图和授予权限集合到一个语句之中。这样可以保证,整个创建和授权语句的原子性,单个表或视图建立的失败或授权失败都将导致整个语句回滚。
简单的例子如下:
SQL> create schema authorization yangtk
2 create table t (id number primary key, name varchar2(30))
3 create table t1 (id number primary key, tid number, num number,
4 constraint fk_t1_t_id foreign key (tid) references t (id))
5 create or replace view v_t as select name, sum(num) sum_num from t, t1
6 where t.id = t1.tid group by name
7 grant select on v_t to public;
create or replace view v_t as select name, sum(num) sum_num from t, t1
*
ERROR 位于第 5 行:
ORA-02422: 方案元素缺失或无效
SQL> create schema authorization yangtk
2 create table t (id number primary key, name varchar2(30))
3 create table t1 (id number primary key, tid number, num number,
4 constraint fk_t1_t_id foreign key (tid) references t (id))
5 create view v_t as select name, sum(num) sum_num from t, t1
6 where t.id = t1.tid group by name
7 grant select on v_t to public;
方案已创建。
注意:在CREATE SCHEMA语句中的CREATE VIEW不能使用CREATE OR REPLACE VIEW语句。
收集统计信息:
Oracle提供了三种收集统计信息的方法:ANALYZE TABLE语句、DBMS_STATS包和其他方法(如:DBMS_DDL.ANALYZE_OBJECT、DBMS_UTILITY.ANALYZE_SCHEMA和DBMS_UTILITY.ANALYZE_DATABASE)。
Oracle推荐使用DBMS_STATS包来收集统计,而且Oracle的后续版本可能只支持DBMS_STATS包收集的统计信息。
需要注意的是,不要收集整个数据库的统计信息,换句话说,不要收集SYS用户的统计信息,这可能会造成系统内部执行计划的改变,从而导致不可预见的问题。
ANALYZE语句还有验证结构和列出行迁移的功能。
完整性约束:
Oracle有两个选项控制完整性约束,每个选项分别有两个状态。组合在一起是4个状态:
ENABLE,VALIDATE:约束有效,且其中数据都是有效的。
ENABLE,NOVALIDATE:约束有效,但不保证已有的数据是否违反约束。
DISABLE,VALIDATE:约束无效,但其中数据是有效的。
DISABLE,NOVALIDATE:约束无效,且已有数据的有效性也不保证。
一般正常情况下约束都是ENABLE,VALIDATE的。它保证表中已经存在的数据符合约束的限制条件,且以后插入到表中的数据也必须满足约束的限制条件。
ENABLE,NOVALIDATE状态也很常用,主要用于保证以后的插入的数据必须满足约束添加,而对表中的现有数据不进行检查。
DISABLE,VALIDATE状态不是很常用,一般用在数据仓库中,验证唯一性数据是否满足条件,同时避免建立没有用的索引。
DISABLE,NOVALIDATE状态一般用于批量导入数据,等导入数据后在ENABLE约束,以提高导入数据的速度。
对于建立为DEFERRABLE的约束,当发出SET CONSTRAINTS ALL DEFERRED语句后,约束的检查延迟到COMMIT的时候。可以在COMMIT之前人为的发出SET CONSTRAINTS ALL IMMEDIATE语句,来检查约束。
延迟约束需要注意两点:一、在触发器中不能使用SET CONSTRAINTS语句;二、延迟主键和唯一约束必须使用非唯一索引。
Oracle提供了监测违反约束条件的数据的方法。首先执行ORACLE_HOME/rdbms/admin/目录下的UTLEXCPT.SQL或UTLEXPT1.SQL建立EXCEPTIONS表。然后执行ALTER TABLE table_name ENABLE CONSTRAINT constraint_name EXCEPTIONS INTO EXCEPTIONS语句,将违反约束的记录的ROWID放入EXCEPTIONS表。
ORACLE提供了DBMS_METADATA包,其中GET_DDL函数可以返回指定对象的创建语句。











