在 Oracle 數(shù)據(jù)庫中,"Schema" 和 "User" 是兩個(gè)相關(guān)但具有不同概念的術(shù)語。
Schema(模式):在 Oracle 中,Schema 是一個(gè)邏輯容器名党,用于組織和管理數(shù)據(jù)庫對象,如表挠轴、視圖传睹、存儲(chǔ)過程、函數(shù)等岸晦。它可以看作是一個(gè)命名空間欧啤,用于將數(shù)據(jù)庫對象進(jìn)行分組和隔離。一個(gè) Schema 可以包含多個(gè)表和其他對象启上,并為這些對象提供命名空間和訪問控制邢隧。Schema 可以由一個(gè) User 擁有,并與 User 的身份關(guān)聯(lián)冈在。
User(用戶):在 Oracle 中倒慧,User 是一個(gè)登錄和訪問數(shù)據(jù)庫的實(shí)體。每個(gè)用戶都有自己的用戶名和密碼讥邻,并擁有在數(shù)據(jù)庫中創(chuàng)建對象和執(zhí)行操作的權(quán)限迫靖。用戶可以擁有一個(gè)或多個(gè) Schema,并在其所擁有的 Schema 中創(chuàng)建和管理對象兴使。一個(gè)用戶可以是一個(gè)數(shù)據(jù)庫管理員(DBA)系宜,或者是一個(gè)應(yīng)用程序的特定用戶。
區(qū)別:
1. Schema 是邏輯上的概念发魄,用于組織和隔離數(shù)據(jù)庫對象盹牧,而 User 是物理上的實(shí)體,用于登錄和訪問數(shù)據(jù)庫励幼。
2. 一個(gè) User 可以擁有一個(gè)或多個(gè) Schema汰寓,但一個(gè) Schema 只能被一個(gè) User 擁有。
3. User 擁有在數(shù)據(jù)庫中創(chuàng)建對象和執(zhí)行操作的權(quán)限苹粟,而 Schema 本身沒有直接的權(quán)限有滑,它繼承自關(guān)聯(lián)的 User。
4. User 的身份是登錄數(shù)據(jù)庫的標(biāo)識(shí)嵌削,而 Schema 的身份是用于在 SQL 語句中引用和操作對象的標(biāo)識(shí)毛好。
總的來說,Schema 和 User 在 Oracle 中有密切關(guān)聯(lián)苛秕,但它們表示不同的概念肌访。Schema 用于組織和隔離數(shù)據(jù)庫對象,而 User 用于登錄和訪問數(shù)據(jù)庫艇劫,并擁有在其所擁有的 Schema 中創(chuàng)建和管理對象的權(quán)限吼驶。
從定義中我們可以看出方案(Schema)為數(shù)據(jù)庫對象的集合,為了區(qū)分各個(gè)集合,我們需要給這個(gè)集合起個(gè)名字蟹演,這些名字就是我們在企業(yè)管理器的方案下看到的許多類似用戶名的節(jié)點(diǎn)风钻,這些類似用戶名的節(jié)點(diǎn)其實(shí)就是一個(gè)schema,schema里面包含了各種對象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links轨帜。
? ? ? 一個(gè)用戶一般對應(yīng)一個(gè)schema,該用戶的schema名等于用戶名魄咕,并作為該用戶缺省schema。這也就是我們在企業(yè)管理器的方案下看到schema名都為數(shù)據(jù)庫用戶名的原因蚌父。Oracle數(shù)據(jù)庫中不能新創(chuàng)建一個(gè)schema哮兰,要想創(chuàng)建一個(gè)schema,只能通過創(chuàng)建一個(gè)用戶的方法解決(Oracle中雖然有create schema語句苟弛,但是它并不是用來創(chuàng)建一個(gè)schema的)喝滞,在創(chuàng)建一個(gè)用戶的同時(shí)為這個(gè)用戶創(chuàng)建一個(gè)與用戶名同名的schema并作為該用戶的缺省shcema。即schema的個(gè)數(shù)同user的個(gè)數(shù)相同膏秫,而且schema名字同user名字一一對應(yīng)并且相同右遭,所有我們可以稱schema為user的別名,雖然這樣說并不準(zhǔn)確缤削,但是更容易理解一些窘哈。
? ? ? 一個(gè)用戶有一個(gè)缺省的schema,其schema名就等于用戶名亭敢,當(dāng)然一個(gè)用戶還可以使用其他的schema滚婉。如果我們訪問一個(gè)表時(shí),沒有指明該表屬于哪一個(gè)schema中的帅刀,系統(tǒng)就會(huì)自動(dòng)給我們在表上加上缺省的schema名让腹。比如我們在訪問數(shù)據(jù)庫時(shí),訪問scott用戶下的emp表扣溺,通過select * from emp; 其實(shí)骇窍,這sql語句的完整寫法為select * from scott.emp。在數(shù)據(jù)庫中一個(gè)對象的完整名稱為schema.object锥余,而不屬user.object腹纳。類似如果我們在創(chuàng)建對象時(shí)不指定該對象的schema,在該對象的schema為用戶的缺省schema驱犹。這就像一個(gè)用戶有一個(gè)缺省的表空間嘲恍,但是該用戶還可以使用其他的表空間,如果我們在創(chuàng)建對象時(shí)不指定表空間着绷,則對象存儲(chǔ)在缺省表空間中蛔钙,要想讓對象存儲(chǔ)在其他表空間中锌云,我們需要在創(chuàng)建對象時(shí)指定該對象的表空間荠医。
? ? ? oracle中的schema就是指一個(gè)用戶下所有對象的集合,schema本身不能理解成一個(gè)對象,oracle并沒有提供創(chuàng)建schema的語法彬向,schema也并不是在創(chuàng)建user時(shí)就創(chuàng)建兼贡,而是在該用戶下創(chuàng)建第一個(gè)對象之后schema也隨之產(chǎn)生,只要user下存在對象娃胆,schema就一定存在遍希,user下如果不存在對象,schema也不存在里烦;這一點(diǎn)類似于temp tablespace group凿蒜,另外也可以通過oem來觀察,如果創(chuàng)建一個(gè)新用戶胁黑,該用戶下如果沒有對象則schema不存在废封,如果創(chuàng)建一個(gè)對象則和用戶同名的schema也隨之產(chǎn)生。