user和schema的區別

warehouse發表於2008-02-28

這兩個概念確實不太好理解

說穿了其實user是控制許可權的,而schema是個容器,非所有者要訪問這個容器下的物件就需要在
物件前面寫上schema(owner)的名字,如果不想寫而又沒有建立synonym,此時可以透過
alter session set current_schema=schema_name
來改變當前session的schema從而在訪問物件時省去schema(owner);
最終能否訪問物件還是要看是否有訪問這個物件的許可權而和schema無關。

[@more@]

user和schema的區別:
說穿了其實user是控制許可權的,而schema是個容器,非所有者要訪問這個容器下的物件就需要在
物件前面寫上schema(owner)的名字,如果不想寫而又沒有建立synonym,此時可以透過
alter session set current_schema=schema_name
來改變當前session的schema從而在訪問物件時省去schema(owner);
最終能否訪問物件還是要看是否有訪問這個物件的許可權而和schema無關。

--下面的話是puber OoNiceDream 發上來的一段非常經典形象的比喻。

user即oracle中的使用者,和所有系統的中使用者概念類似,使用者所持有的是系統的許可權及資源;
而schema所涵蓋的是各種物件,它包含了表、函式、包等等物件的“所在地”,並不包括對他們的許可權控制。
好比一個房子,裡面放滿了傢俱,對這些傢俱有支配權的是房子的主人(user),而不是房子(schema)。
你可以也是一個房子的主人(user),擁有自己的房子(schema)。可以透過alter session的方式進入別人的房子。
這個時候,你可以看到別人房子裡的傢俱(desc)。
如果你沒有特別指定的話,你所做的操作都是針對你當前所在房子中的東西。
至於你是否有許可權使用(select)、搬動(update)或者拿走(delete)這些傢俱就看這個房子的主人有沒有給你這樣的許可權了,
或者你是真個大廈(DB)的老大(DBA)。alter session set schema可以用來代替synonyms。
如果你想呼叫其他schema的物件(有許可權的前提下),又沒建synonym,有不想把其他schema名字放如程式碼中,
就可以先alter session set schema=。


SQL> connect /as sysdba
已連線。

SQL> revoke dba from xys,test;
revoke dba from xys,test
*
第 1 行出現錯誤:
ORA-01951: ROLE 'DBA' 未授予 'XYS'


SQL> revoke dba from test;

撤銷成功。

SQL> connect xys/manager
已連線。
SQL> select table_name from user_tables;

未選定行

SQL> create table t(id int) ;

表已建立。

SQL> insert into t values(1);

已建立 1 行。

SQL> commit;

提交完成。

SQL> connect test/test
已連線。
SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
T
TT
SYS_TEMP_FBT

SQL> desc t
名稱 是否為空? 型別
----------------------------------------- -------- ----------------------------

ID NUMBER(38)

SQL> select * from t;

未選定行

SQL> show user
USER 為 "TEST"
SQL> select * from xys.t;
select * from xys.t
*
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在

SQL> alter session set current_schema=xys;

會話已更改。

SQL> show user
USER 為 "TEST"
SQL> select * from xys.t;
select * from xys.t
*
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在


SQL> select * from t;
select * from t
*
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在

SQL> alter session set current_schema=TEST;

會話已更改。

SQL> select * from t;

未選定行

SQL> connect xys/manager
已連線。
SQL> grant select on t to test;

授權成功。

SQL> connect test/test
已連線。
SQL> select * from xys.t;

ID
----------
1

SQL> alter session set current_schema=xys;

會話已更改。

SQL> select * from t;

ID
----------
1

SQL>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1000155/,如需轉載,請註明出處,否則將追究法律責任。

相關文章