Oracle里schema理解


Oracle中,一個用戶就是一個Schema,表都是建立在Schema中的,也可以理解為每個用戶擁有不同的表。一個用戶想訪問另外一個用戶,也就是另外一個schema的表的時候,
可以用 username.tablename的形式來訪問,完全不需要分布式事務。分布式事務不是給你做這個用的。

Oracle數據庫中不能新創建一個schema,要想創建一個schema,只能通過創建一個用戶的方法解決。

Oracle中雖然有create schema語句,但是它並不是用來創建一個schema的,具體見下面官方文檔。

Use the CREATE SCHEMA statement to create multiple tables and views and perform multiple grants in your own schema in a single transaction.
To execute a CREATE SCHEMA statement, Oracle Database executes each included statement. If all statements execute successfully, then the database commits the transaction. If any statement results in an error, then the database rolls back all the statements.

這里糾正下網上一些錯誤的觀點,Oracle在創建一個用戶的同時會為這個用戶創建一個與用戶名同名的schem並作為該用戶的缺省shcema。即schema的個數同user的個數相同,而且schema名字同user名字一一 對應並且相同。官方文檔如下

 

深入理解user和schema的區別
不同的schema之間它們沒有直接的關系,不同的shcema之間的表可以同名, 也可以互相引用(但必須有權限),在沒有操作別的schema的操作根權下, 每個用戶只能操作它自己的schema下的所有的表。不同的schema下的同名的表, 可以存入不同的數據(即schema用戶自己的數據)。 好比一個房子,里面放滿了家具,對這些家具有支配權的是房子的主人(user),而不是房子(schema)。
你可以也是一個房子的主人(user),擁有自己的房子(schema)。可以通過alter session的方式
進入別人的房子。 這個時候,你可以看到別人房子里的家具(desc)。 如果你沒有特別指定的話,你所做的操作都是針對你當前所在房子中的東西。 至於你是否有權限使用(select)、搬動(update)或者拿走(delete)這些家具就看這個房子的
主人有沒有給你這樣的權限了,或者你是整個大廈(DB)的老大(DBA)。
如果你想調用其他schema的對象(有權限的前提下),但並沒有建synonym, 同時又不想把其他schema名字放入代碼中,就可以首先使用

alter session set current_schema=<schema_name>。

實際案例

SQL> SHOW USER; 
USER is "SYS"
SQL> alter session set current_schema=SCOTT;
Session altered.
SQL> SHOW USER; 
USER is "SYS"          #切換Schema並不等同於切換User
SQL> SELECT COUNT(*) FROM EMP;
  COUNT(*)
----------
        14
SQL> alter session set current_schema=SYS;
Session altered.
SQL> SELECT COUNT(*) FROM EMP;
SELECT COUNT(*) FROM EMP
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> CREATE USER oe111 IDENTIFIED BY oePSWRD;
User created.
SQL> CREATE SCHEMA AUTHORIZATION oe111
   CREATE TABLE new_product
      (color VARCHAR2(10)  PRIMARY KEY, quantity NUMBER)
   CREATE VIEW new_product_view
      AS SELECT color, quantity FROM new_product WHERE color = 'RED'
   GRANT select ON new_product_view TO scott
/
*
ERROR at line 1:
ORA-02421: missing or invalid schema authorization identifier
SQL> grant dba to oe111;
Grant succeeded.
SQL>  CREATE SCHEMA AUTHORIZATION oe111
  2      CREATE TABLE new_product
       (color VARCHAR2(10)  PRIMARY KEY, quantity NUMBER)
    CREATE VIEW new_product_view
  5         AS SELECT color, quantity FROM new_product WHERE color = 'RED'
  6      GRANT select ON new_product_view TO scott
  7  ;
 CREATE SCHEMA AUTHORIZATION oe111
*
ERROR at line 1:    #切換該語句必須在同一Schema下才能執行

ORA-02421: missing or invalid schema authorization identifier 
切換Schema

SQL> CONN OE111/oePSWRD
Connected.
SQL>  CREATE SCHEMA AUTHORIZATION oe111
     CREATE TABLE new_product
   (color VARCHAR2(10)  PRIMARY KEY, quantity NUMBER)
CREATE VIEW new_product_view
        AS SELECT color, quantity FROM new_product WHERE color = 'RED'
     GRANT select ON new_product_view TO scott
/

 

參考至:http://blog.csdn.net/kimsoft/article/details/4627520

                 http://www.2cto.com/database/201205/131238.html

                 http://blog.sina.com.cn/s/blog_6c845fae0100peof.html

                 http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6014.htm

本文原創,轉載請著名出處、作者

如有錯誤,歡迎指正

郵箱:czmcj@163.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM