Oracle中User和Schema的區別和聯絡
今天在閱讀Oracle官方文件的時候,讀到schema的基本概念,這就讓我產生了一個疑問:user和schema兩者之間到底有什麼區別?為了更深層次的理解二者之間的區別和聯絡,以下是官方文件中關於user和schema的解釋:
“A schema is a collection of database objects. A schema is owned by a database user and has the same name as that user. Schema objects are the logical structures that directly refer to the database’s data. Schema objects include structures like tables, views, and indexes.(There is no relationship between a tablespace and a schema. Objects in the same schema can be in different tablespaces, and a tablespace can hold objects from different schemas.)”
“A
user is a name defined in the database that can connect to and access objects.
Schemas and users help database administrators manage database security.”
官方文件裡面說得比較明白:
schema是資料物件的集合,包括像表、檢視、索引、同義詞等等都可以說是schema的物件。但不夠生動,網上有篇文章裡面把schema和user的關係用一個形象的比喻闡述得非常透徹,引用如下:
“user即Oracle中的使用者,和所有系統的中使用者概念類似,使用者所持有的是系統的許可權及資源;而schema所涵蓋的是各種物件,它包含了表、函式、包等等物件的“所在地”,並不包括對他們的許可權控制。
Oracle中的schema就是指一個使用者下所有物件的集合,schema本身不能理解成一個物件,oracle並沒有提供建立schema的語法,schema也並不是在建立user時就建立,而是在該使用者下建立第一個物件之後schema也隨之產生,只要user下存在物件,schema就一定存在,user下如果不存在物件,schema也不存在;如果建立一個新使用者,該使用者下如果沒有物件則schema不存在,如果建立一個物件則和使用者同名的schema也隨之產生。實際上在使用上,shcema與user完全一樣,沒有什麼區別,在出現schema名的地方也可以出現user名。
在資料庫中 一個物件的完整名稱為schema.object,而不屬user.object。類似如果我們在建立物件時不指定該物件的schema,在該物件的schema為使用者的預設schema。
好比一個房子,裡面放滿了傢俱,對這些傢俱有支配權的是房子的主人(user),而不是房子(schema)。你可以也是一個房子的主人(user),擁有自己的房子(schema).可以透過alter session的方式進入別人的房子。如果你沒有特別指定的話,你所做的操作都是針對你當前所在房子中的東西。至於你是否有許可權使用(select)、搬動(update)或者拿走(delete)這些傢俱就看這個房子的主人有沒有給你這樣的許可權了,或者你是整個大廈(DB)的老大(DBA)。alter session set schema可以用來代替synonyms。如果你想呼叫其他schema的物件(有許可權的前提下),但並沒有建synonym,同時又不想把其他 schema名字放入程式碼中,就可以首先使用alter session set schema=<其他schema名字>。”
這段文字說得非常生動,把user和schema的區別闡述得很透徹,下面透過具體的例子來加深對user和schema兩者區別的認識:
第一步,以sys使用者登陸SQL並建立普通使用者wjq和seiang:
[oracle@seiang11g ~]$ sqlplus / as sysdba
SYS@seiang11g> create user wjq identified by wjq;
User created.
SYS@seiang11g> create user seiang identified by seiang;
User created.
第二步,賦予一些基本的許可權給新建的使用者wjq和seiang:
SYS@seiang11g> grant connect,create table,resource to wjq,seiang;
Grant succeeded.
第三步,以wjq使用者登陸,建立一張表並插入資料:
SYS@seiang11g> conn wjq/wjq
Connected.
WJQ@seiang11g> create table t (id int);
Table created.
WJQ@seiang11g> insert into t values(1);
1 row created.
WJQ@seiang11g> commit;
Commit complete.
第四步,以seiang使用者登陸,看能否查詢wjq使用者所建表裡面的資料:
SYS@seiang11g>conn seiang/seiang
Connected.
SEIANG@seiang11g> select table_name from user_tables;
no rows selected
SEIANG@seiang11g> show user;
USER is "SEIANG"
SEIANG@seiang11g> select * from wjq.t;
select * from wjq.t
*
ERROR at line 1:
ORA-00942: table or view does not exist
從以上結果可以看出,使用者 seiang無法檢視使用者wjq所建表裡面的內容,甚至被告知沒有這張表。
第五步,修改當前schema為wjq,並繼續查詢:
SEIANG@seiang11g> alter session set current_schema=wjq;
Session altered.
SEIANG@seiang11g> show user;
USER is "SEIANG"
SEIANG@seiang11g> select * from wjq.t;
select * from wjq.t
*
ERROR at line 1:
ORA-00942: table or view does not exist
仍然不能檢視。
第六步,以wjq使用者登陸,賦予seiang使用者檢視t表的許可權:
SYS@seiang11g> conn wjq/wjq
Connected.
WJQ@seiang11g> grant select on t to seiang;
Grant succeeded.
第七步,以seiang使用者登陸,檢視wjq使用者的t表:
SYS@seiang11g> conn seiang/seiang
Connected.
SEIANG@seiang11g>select * from wjq.t;
ID
----------
1
更簡單的,將當前schema更改為seiang,可以簡化查詢過程:
SEIANG@seiang11g> alter session set current_schema=wjq;
Session altered.
SEIANG@seiang11g> select * from t;
ID
----------
1
這個實驗下來,對user和schema的區別和聯絡應該有了進一步的理解了。
作者:SEian.G(苦練七十二變,笑對八十一難)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31015730/viewspace-2145130/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE中的兩個概念:user和schema的區別和聯絡Oracle
- Oracle User 和 Schema 的區別Oracle
- user和schema的區別
- 水煮oracle33---關於oracle中segment、schema和user區別Oracle
- 中斷和異常,陷阱的區別和聯絡
- javaSE中的==和equals的聯絡與區別Java
- Oracle中drop user和drop user cascade的區別Oracle
- tcp/ip和http的區別和聯絡TCPHTTP
- orcle pfile和spfile的區別和聯絡
- NET|Ref 和out 的區別和聯絡
- Instruction和Question的區別和聯絡Struct
- hive中order by、distribute by、sort by和cluster by的區別和聯絡Hive
- 詳解CALayer 和 UIView的區別和聯絡UIView
- http、socket、tcp的區別和聯絡?HTTPTCP
- SCADA和PLC的區別聯絡
- Session和Cookie的聯絡與區別SessionCookie
- CGI與Servlet的區別和聯絡Servlet
- Session和Cookie的區別與聯絡SessionCookie
- 轉:IDOCBAPIRFC區別和聯絡API
- Vue中watch、computed與methods的聯絡和區別Vue
- Python中time和datetime的區別與聯絡Python
- php中$_REQUEST、$_POST、$_GET的區別和聯絡小結PHP
- java-介面和抽象類的聯絡和區別。Java抽象
- Jdk、Jre Jvm的區別和聯絡JDKJVM
- Linux和Ubuntu的區別與聯絡LinuxUbuntu
- 資料庫中varchar和Nvarchar區別與聯絡資料庫
- has、ohasd、crs、cluster區別和聯絡
- 【知識點】 gcc和g++的聯絡和區別GC
- Rxjs map, mergeMap 和 switchMap 的區別和聯絡JS
- Python中__new__和__init__的區別與聯絡Python
- 程式和執行緒的區別與聯絡執行緒
- HDFS 塊和 Input Splits 的區別與聯絡
- NUMA,MPP和HADOOP的區別與聯絡Hadoop
- 並行和併發的區別與聯絡並行
- volatile和synchronized的區別與聯絡[轉]synchronized
- malloc free與new delete的區別和聯絡delete
- C/C++引用和指標的聯絡和區別C++指標
- SAP UI5 和 OpenUI5 的區別和聯絡UI