ORACLE中的两个概念:user和schema的区别和联系
http://oracle.chinaitlab.com/induction/835839.html
今天重讀ORACLE官方文檔《concepts》,讀到schema的基本概念,對它的理解更進一層,官方文檔中關(guān)于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.)”
官方文檔里面說得比較明白,schema是數(shù)據(jù)對象的集合,包括像表、視圖、索引、同義詞等等都可以說是schema的對象。但不夠生動,網(wǎng)上有篇文章里面把schema和user的關(guān)系用一個形象的比喻闡述得非常透徹,引用如下:
“user即Oracle中的用戶,和所有系統(tǒng)的中用戶概念類似,用戶所持有的是系統(tǒng)的權(quán)限及資源;而schema所涵蓋的是各種對象,它包含了表、函數(shù)、包等等對象的“所在地”,并不包括對他們的權(quán)限控制。好比一個房子,里面放滿了家具,對這些家具有支配權(quán)的是房子的主人(user),而不是房子(schema)。你可以也是一個房子的主人(user),擁有自己的房子(schema).可以通過alter session的方式進入別人的房子。如果你沒有特別指定的話,你所做的操作都是針對你當(dāng)前所在房子中的東西。至于你是否有權(quán)限使用(select)、搬動(update)或者拿走(delete)這些家具就看這個房子的主人有沒有給你這樣的權(quán)限了,或者你是整個大廈(DB)的老大(DBA)。alter session set schema可以用來代替synonyms。如果你想調(diào)用其他schema的對象(有權(quán)限的前提下),但并沒有建synonym,同時又不想把其他 schema名字放入代碼中,就可以首先使用alter session set schema=<其他schema名字>。”
這段文字說得非常生動,把user和schema的區(qū)別闡述得很透徹,下面通過具體的例子來加深對user和schema兩者區(qū)別的認識:
第一步,以sys用戶登陸SQL并建立普通用戶storm和penguin:
$ sqlplus / as sysdba
SQL> create user storm identified by storm;
User created.
SQL> create user penguin identified by penguin;
User created.
第二步,賦予一些基本的權(quán)限給新建的用戶storm和penguin:
SQL> grant connect,create table,resource to storm,penguin;
Grant succeeded.
第三步,以storm用戶登陸,創(chuàng)建一張表并插入數(shù)據(jù):
SQL> conn storm/storm
Connected.
SQL> create table t (id int);
Table created.
SQL> insert into t values(1);
1 row created.
SQL> commit;
Commit complete.
第四步,以penguin用戶登陸,看能否查詢storm用戶所建表里面的數(shù)據(jù):
SQL> conn penguin/penguin
Connected.
SQL> select table_name from user_tables;
no rows selected
SQL> show user;
USER is "PENGUIN"
SQL> select * from storm.t;
select * from storm.t
*
ERROR at line 1:
ORA-00942: table or view does not exist
從以上結(jié)果可以看出,用戶 penguin無法查看用戶storm所建表里面的內(nèi)容,甚至被告知沒有這張表。
第五步,修改當(dāng)前schema為storm,并繼續(xù)查詢:
SQL> alter session set current_schema=storm;
Session altered.
SQL> show user;
USER is "PENGUIN"
SQL> select * from storm.t;
select * from storm.t
*
ERROR at line 1:
ORA-00942: table or view does not exist
仍然不能查看。
第六步,以storm用戶登陸,賦予penguin用戶查看t表的權(quán)限:
SQL> conn storm/storm
Connected.
SQL> grant select on t to penguin;
Grant succeeded.
第七步,以penguin用戶登陸,查看storm用戶的t表:
SQL> conn penguin/penguin
Connected.
SQL> select * from storm.t;
ID
----------
1
更簡單的,將當(dāng)前schema更改為storm,可以簡化查詢過程:
SQL> alter session set current_schema=storm;
Session altered.
SQL> select * from t;
ID
----------
1
這個實驗下來,對user和schema的區(qū)別和聯(lián)系應(yīng)該有了進一步的理解了。
?
?
==========
http://langgufu.iteye.com/blog/1469055
有的人還是對schema的真正含義不太理解,現(xiàn)在我再次整理了一下,希望對大家有所幫助。
我們先來看一下他們的定義:
A schema is a collection of database objects (used by a user.).
Schema objects are the logical structures that directly refer to the database’s data.
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為數(shù)據(jù)庫對象的集合,為了區(qū)分各個集合,我們需要給這個集合起個名字,這些名字就是我們在企業(yè)管理器的方案下看到的許多類似用戶名的節(jié)點,這些類似用戶名的節(jié)點其實就是一個schema,schema里面包含了各種對象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。
一個用戶一般對應(yīng)一個schema,該用戶的schema名等于用戶名,并作為該用戶缺省schema。這也就是我們在企業(yè)管理器的方案下看到schema名都為數(shù)據(jù)庫用戶名的原因。Oracle數(shù)據(jù)庫中不能新創(chuàng)建一個schema,要想創(chuàng)建一個schema,只能通過創(chuàng)建一個用戶的方法解決(Oracle中雖然有create schema語句,但是它并不是用來創(chuàng)建一個schema的),在創(chuàng)建一個用戶的同時為這個用戶創(chuàng)建一個與用戶名同名的schem并作為該用戶的缺省shcema。即schema的個數(shù)同user的個數(shù)相同,而且schema名字同user名字一一 對應(yīng)并且相同,所有我們可以稱schema為user的別名,雖然這樣說并不準確,但是更容易理解一些。
一個用戶有一個缺省的schema,其schema名就等于用戶名,當(dāng)然一個用戶還可以使用其他的schema。如果我們訪問一個表時,沒有指明該表屬于哪一個schema中的,系統(tǒng)就會自動給我們在表上加上缺省的sheman名。比如我們在訪問數(shù)據(jù)庫時,訪問scott用戶下的emp表,通過select * from emp; 其實,這sql語句的完整寫法為select * from scott.emp。在數(shù)據(jù)庫中一個對象的完整名稱為schema.object,而不屬user.object。類似如果我們在創(chuàng)建對象時不指定該對象的schema,在該對象的schema為用戶的缺省schema。這就像一個用戶有一個缺省的表空間,但是該用戶還可以使用其他的表空間,如果我們在創(chuàng)建對象時不指定表空間,則對象存儲在缺省表空間中,要想讓對象存儲在其他表空間中,我們需要在創(chuàng)建對象時指定該對象的表空間。
咳,說了這么多,給大家舉個例子,否則,一切枯燥無味!
SQL> Gruant dba to scott
SQL> create table test(name char(10));
Table created.
SQL> create table system.test(name char(10));
Table created.
SQL> insert into test values('scott');
1 row created.
SQL> insert into system.test values('system');
1 row created.
SQL> commit;
Commit complete.
SQL> conn system/manager
Connected.
SQL> select * from test;
NAME
----------
system
SQL> ALTER SESSION SET CURRENT_SCHEMA = scott; --改變用戶缺省schema名
Session altered.
SQL> select * from test;
NAME
----------
scott
SQL> select owner ,table_name from dba_tables where table_name=upper('test');
OWNER TABLE_NAME
------------------------------ ------------------------------
SCOTT TEST
SYSTEM TEST
--上面這個查詢就是我說將schema作為user的別名的依據(jù)。實際上在使用上,shcema與user完全一樣,沒有什么區(qū)別,在出現(xiàn)schema名的地方也可以出現(xiàn)user名。
表空間:
一個表空間就是一片磁盤區(qū)域,他又一個或者多個磁盤文件組成,一個表空間可以容納許多表、索引或者簇等
每個表空間又一個預(yù)制的打一磁盤區(qū)域稱為初始區(qū)間(initial extent)用完這個區(qū)間厚在用下一個,知道用完表空間,這時候需要對表空間進行擴展,增加數(shù)據(jù)文件或者擴大已經(jīng)存在的數(shù)據(jù)文件
?
?
instance是一大坨內(nèi)存sga,pga....和后臺的進程smon pmon.....組成的一個大的應(yīng)用。 schema就是一個用戶和他下面的所有對象。。 tablspace 邏輯上用來放objects.物理上對應(yīng)磁盤上的數(shù)據(jù)文件或者裸設(shè)備。 |
在Oracle中,結(jié)合邏輯存儲與物理存儲的概念,我們可以這樣來理解數(shù)據(jù)庫、表空間、SCHEMA、數(shù)據(jù)文件這些概念:
數(shù)據(jù)庫是一個大圈,里面圈著的是表空間,表空間里面是數(shù)據(jù)文件,那么schema是什么呢?schema是一個邏輯概念,是一個集合,但schema并不是一個對象,oracle也并沒有提供創(chuàng)建schema的語法。
schema:
一般而言,一個用戶就對應(yīng)一個schema,該用戶的schema名等于用戶名,并作為該用戶缺省schema,用戶是不能創(chuàng)建schema的,schema在創(chuàng)建用戶的時候創(chuàng)建,并可以指定用戶的各種表空間(這點與PostgreSQL是不同,PostgreSQL是可以創(chuàng)建schema并指派給某個用戶)。當(dāng)前連接到數(shù)據(jù)庫上的用戶創(chuàng)建的所有數(shù)據(jù)庫對象默認都屬于這個schema(即在不指明schema的情況下),比如若用戶scott連接到數(shù)據(jù)庫,然后create table test(id int not null)創(chuàng)建表,那么這個表被創(chuàng)建在了scott這個schema中;但若這樣create kanon.table test(id int not null)的話,這個表被創(chuàng)建在了kanon這個schema中,當(dāng)然前提是權(quán)限允許。
創(chuàng)建用戶的方法是這樣的:
create user 用戶名 identified by 密碼
default tablespace 表空間名
temporary tablespace 表空間名
quota 限額 (建議創(chuàng)建的時候指明表空間名)
由此來看,schema是一個邏輯概念。
但一定要注意一點:schema好像并不是在創(chuàng)建user時就創(chuàng)建的,而是在該用戶創(chuàng)建了第一個對象之后才將schema真正創(chuàng)建的,只有user下存在對象,他對應(yīng)的schema才會存在,如果user下不存在任何對象了,schema也就不存在了;
?
數(shù)據(jù)庫:
在oracle中,數(shù)據(jù)庫是由表空間來組成的,而表空間里面是具體的物理文件---數(shù)據(jù)文件。我們可以創(chuàng)建數(shù)據(jù)庫并為其指定各種表空間。
?
表空間:
這是個邏輯概念,本質(zhì)上是一個或者多個數(shù)據(jù)文件的集合。
?
數(shù)據(jù)文件:
具體存儲數(shù)據(jù)的物理文件,是一個物理概念。
一個數(shù)據(jù)文件只能屬于一個表空間,一個表空間可以包含一個或多個數(shù)據(jù)文件。一個數(shù)據(jù)庫由多個表空間組成,一個表空間只能屬于一個數(shù)據(jù)庫。
?
若還不理解,下面是我從網(wǎng)上摘的一個比喻,很形象的解釋了什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User,不妨一看。
“我們可以把Database看作是一個大倉庫,倉庫分了很多很多的房間,Schema就是其中的房間,一個Schema代表一個房間,Table可以看作是每個Schema中的床,Table(床)被放入每個房間中,不能放置在房間之外,那豈不是晚上睡覺無家可歸了,然后床上可以放置很多物品,就好比 Table上可以放置很多列和行一樣,數(shù)據(jù)庫中存儲數(shù)據(jù)的基本單元是Table,現(xiàn)實中每個倉庫放置物品的基本單位就是床, User就是每個Schema的主人,(所以Schema包含的是Object,而不是User),user和schema是一一對應(yīng)的,每個user在沒有特別指定下只能使用自己schema(房間)的東西,如果一個user想使用其他schema(房間)的東西,那就要看那個schema(房間)的user(主人)有沒有給你這個權(quán)限了,或者看這個倉庫的老大(DBA)有沒有給你這個權(quán)限了。換句話說,如果你是某個倉庫的主人,那么這個倉庫的使用權(quán)和倉庫中的所有東西都是你的(包括房間),你有完全的操作權(quán),可以扔掉不用的東西從每個房間,也可以放置一些有用的東西到某一個房間,你還可以給每個User分配具體的權(quán)限,也就是他到某一個房間能做些什么,是只能看(Read-Only),還是可以像主人一樣有所有的控制權(quán)(R/W),這個就要看這個User所對應(yīng)的角色Role了。”---摘自網(wǎng)絡(luò)
| ? |
?
總結(jié)
以上是生活随笔為你收集整理的ORACLE中的两个概念:user和schema的区别和联系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delete 误删了全表数据
- 下一篇: hibernate实体的几种状态