Create Schema的使用体会

上一篇 / 下一篇  2007-12-12 10:39:31 / 天气: 晴朗 / 心情: 平静

Create Schema语句是SQL99的一个特性。ORACLE中描述其作用是在你自己的schema内在单个事务里完成多个表和视图的创建以及多个授权(Use theCREATESCHEMAstatement to create multiple tables and views and perform. multiple grants in your own schema in a single transaction.)。它的语法是:



所以首先一点,”schema”必须是当前连接的用户,不能为其他用户创建。即使你修改current_schema,例如:

SQL> show user

USER is "SYSTEM"

SQL> CREATE SCHEMA AUTHORIZATION guoge

 2 CREATE TABLE ASSET_ACCESSORY (

 3    ASSET_NO            VARCHAR2(18)                   not null,

 4    ITEM_NO             NUMBER(3)                      not null,

 5    NAME                VARCHAR2(40),

 6    SPEC                VARCHAR2(20),

 7    AMOUNT              NUMBER(3),

 8    COSTS               NUMBER(10,2),

 9    STATUS              VARCHAR2(16),

 10    LOCATION            VARCHAR2(40),

 11    MEMO                VARCHAR2(20)

 12    )

 13 ;

 CREATE SCHEMA AUTHORIZATION guoge

*

ERROR at line 1:

ORA-02421: missing or invalid schema authorization identifier

SQL> alter session set current_schema=guoge;

 

Session altered.

 

SQL> CREATE SCHEMA AUTHORIZATION guoge

 2 CREATE TABLE ASSET_ACCESSORY (

 3    ASSET_NO            VARCHAR2(18)                   not null,

 4    ITEM_NO             NUMBER(3)                      not null,

 5    NAME                VARCHAR2(40),

 6    SPEC                VARCHAR2(20),

 7    AMOUNT              NUMBER(3),

 8    COSTS               NUMBER(10,2),

 9    STATUS              VARCHAR2(16),

 10    LOCATION            VARCHAR2(40),

 11    MEMO                VARCHAR2(20)

 12    )

 13 ;

 CREATE SCHEMA AUTHORIZATION guoge

*

ERROR at line 1:

ORA-02421: missing or invalid schema authorization identifier

 

 

其次,Create Schema语句关于创建视图的语句只能是Create View而不能是Create Or Replace View,这一点,yangtingkun方案对象的一般性管理——管理员手册》有说明。这一点,ORACLE的文档中并没有说明。

那么,这条语句什么时候使用呢?

在创建系统的安装脚本时,经常创建一部分表后出现错误,退出安装脚本。这个时候一般要先清除脚本,把原来创建的表先删除。如果使用Create Schema语句,当后面的语句失败了,前面的语句创建的对象或授权自动取消,就不必再执行清除操作。

 

在具体实现上,ORACLE应该不是我们简单地想像先创建前面的对象,后面的语句错误时再删除前面的对象。通过LOGMNR,我们可以看不到前面创建对象真的执行,这可能被ORACLE真正封装在一个事务里。但是,在解析过程中,ORACLE还是把里面的语句逐一解析,例如:

 

SQL> alter session set timed_statistics = true;

 

Session altered.

SQL> alter session set sql_trace=true ;

 

Session altered.

 

SQL> create schema authorization guoge

 2      create table t (id number , name varchar2(30))

 3       grant select on v_t to public1;

     grant select on v_t to public1

     *

ERROR at line 3:

ORA-02426: privilege grant failed

ORA-00942: table or view does not exist

 

 

SQL>  alter session set sql_trace=false ;

 

Session altered.

 

D:\oracle\admin\ORCL\udump>tkprof ORA01336.trc ORA01336.txt sys=no

 

TKPROF: Release8.1.7.4.1 - Production on Wed Dec 12 10:21:01 2007

 

(c) Copyright 2000 Oracle Corporation. All rights reserved.

 

查看ORA01336.txt

 

 

The following statement encountered a error during parse:

 

     grant select on v_ ...

EXEC #3:c=0,e=0,p=0,cr

Error encountered: ORA-00942

********************************************************************************

 

alter session set sql_trace=true

 

 

call    count      cpu   elapsed      disk     query   current       rows

------- ------ -------- ---------- ---------- ---------- ---------- ----------

Parse       0     0.00      0.00         0         0         0          0

Execute     1     0.00      0.00         0         0         0          0

Fetch       0     0.00      0.00         0         0         0          0

------- ------ -------- ---------- ---------- ---------- ---------- ----------

total       1     0.00      0.00         0         0         0          0

 

Misses in library cache during parse: 0

Optimizer goal: CHOOSE

Parsing user id: 3727 

********************************************************************************

 

create schema authorization guoge

    create table t (id number , name varchar2(30))

     grant select on v_t to public1

 

call    count      cpu   elapsed      disk     query   current       rows

------- ------ -------- ---------- ---------- ---------- ---------- ----------

Parse       1     0.00      0.00         0         0         0          0

Execute     0     0.00      0.00         0         0         0          0

Fetch       0     0.00      0.00         0         0         0          0

------- ------ -------- ---------- ---------- ---------- ---------- ----------

total       1     0.00      0.00         0         0         0          0

 

Misses in library cache during parse: 1

Optimizer goal: CHOOSE

Parsing user id: 3727 

********************************************************************************

 

create table t (id number , name varchar2(30))

 

 

call    count      cpu   elapsed      disk     query   current       rows

------- ------ -------- ---------- ---------- ---------- ---------- ----------

Parse       1     0.00      0.00         0         0         0          0

Execute     1     0.00      0.00         0         0         4          0

Fetch       0     0.00      0.00         0         0         0          0

------- ------ -------- ---------- ---------- ---------- ---------- ----------

total       2     0.00      0.00         0         0         4          0

 

Misses in library cache during parse: 1

Optimizer goal: CHOOSE

Parsing user id: 3727    (recursive depth: 1)

********************************************************************************

 

TAG: oracle

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-07-09  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 407
  • 日志数: 19
  • 文件数: 1
  • 建立时间: 2007-12-12
  • 更新时间: 2008-02-25

RSS订阅

Open Toolbar