溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Oracle中User和Schema的區(qū)別和聯(lián)系

發(fā)布時(shí)間:2020-08-11 15:19:28 來(lái)源:ITPUB博客 閱讀:738 作者:迷倪小魏 欄目:關(guān)系型數(shù)據(jù)庫(kù)

今天在閱讀Oracle官方文檔的時(shí)候,讀到schema的基本概念,這就讓我產(chǎn)生了一個(gè)疑問(wèn):user和schema兩者之間到底有什么區(qū)別?為了更深層次的理解二者之間的區(qū)別和聯(lián)系,以下是官方文檔中關(guān)于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.”


  官方文檔里面說(shuō)得比較明白:

schema是數(shù)據(jù)對(duì)象的集合,包括像表、視圖、索引、同義詞等等都可以說(shuō)是schema的對(duì)象。但不夠生動(dòng),網(wǎng)上有篇文章里面把schema和user的關(guān)系用一個(gè)形象的比喻闡述得非常透徹,引用如下: 
  “user即Oracle中的用戶,和所有系統(tǒng)的中用戶概念類似,用戶所持有的是系統(tǒng)的權(quán)限及資源;而schema所涵蓋的是各種對(duì)象,它包含了表、函數(shù)、包等等對(duì)象的“所在地”,并不包括對(duì)他們的權(quán)限控制。

Oracle中的schema就是指一個(gè)用戶下所有對(duì)象的集合,schema本身不能理解成一個(gè)對(duì)象,oracle并沒(méi)有提供創(chuàng)建schema的語(yǔ)法,schema也并不是在創(chuàng)建user時(shí)就創(chuàng)建,而是在該用戶下創(chuàng)建第一個(gè)對(duì)象之后schema也隨之產(chǎn)生,只要user下存在對(duì)象,schema就一定存在,user下如果不存在對(duì)象,schema也不存在;如果創(chuàng)建一個(gè)新用戶,該用戶下如果沒(méi)有對(duì)象則schema不存在,如果創(chuàng)建一個(gè)對(duì)象則和用戶同名的schema也隨之產(chǎn)生。實(shí)際上在使用上,shcema與user完全一樣,沒(méi)有什么區(qū)別,在出現(xiàn)schema名的地方也可以出現(xiàn)user名。

在數(shù)據(jù)庫(kù)中 一個(gè)對(duì)象的完整名稱為schema.object,而不屬user.object。類似如果我們?cè)趧?chuàng)建對(duì)象時(shí)不指定該對(duì)象的schema,在該對(duì)象的schema為用戶的缺省schema。
      
好比一個(gè)房子,里面放滿了家具,對(duì)這些家具有支配權(quán)的是房子的主人(user),而不是房子(schema)。你可以也是一個(gè)房子的主人(user),擁有自己的房子(schema).可以通過(guò)alter session的方式進(jìn)入別人的房子。如果你沒(méi)有特別指定的話,你所做的操作都是針對(duì)你當(dāng)前所在房子中的東西。至于你是否有權(quán)限使用(select)、搬動(dòng)(update)或者拿走(delete)這些家具就看這個(gè)房子的主人有沒(méi)有給你這樣的權(quán)限了,或者你是整個(gè)大廈(DB)的老大(DBA)。alter session set schema可以用來(lái)代替synonyms。如果你想調(diào)用其他schema的對(duì)象(有權(quán)限的前提下),但并沒(méi)有建synonym,同時(shí)又不想把其他 schema名字放入代碼中,就可以首先使用alter session set schema=<其他schema名字>?!?nbsp;


  這段文字說(shuō)得非常生動(dòng),把user和schema的區(qū)別闡述得很透徹,下面通過(guò)具體的例子來(lái)加深對(duì)user和schema兩者區(qū)別的認(rèn)識(shí): 


第一步,以sys用戶登陸SQL并建立普通用戶wjqseiang 
  [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. 

第二步,賦予一些基本的權(quán)限給新建的用戶wjqseiang 
  SYS@seiang11g> grant connect,create table,resource to wjq,seiang; 
  Grant succeeded. 

第三步,以wjq用戶登陸,創(chuàng)建一張表并插入數(shù)據(jù): 
  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用戶所建表里面的數(shù)據(jù): 
  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 
  從以上結(jié)果可以看出,用戶 seiang無(wú)法查看用戶wjq所建表里面的內(nèi)容,甚至被告知沒(méi)有這張表。 

第五步,修改當(dāng)前schemawjq,并繼續(xù)查詢: 
  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表的權(quán)限: 
  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 

  更簡(jiǎn)單的,將當(dāng)前schema更改為seiang,可以簡(jiǎn)化查詢過(guò)程: 
  SEIANG@seiang11g> alter session set current_schema=wjq; 
  Session altered. 

  SEIANG@seiang11g> select * from t; 
  ID 
  ---------- 
  1 
  這個(gè)實(shí)驗(yàn)下來(lái),對(duì)user和schema的區(qū)別和聯(lián)系應(yīng)該有了進(jìn)一步的理解了。



作者:SEian.G(苦練七十二變,笑對(duì)八十一難)


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI