ORACLE中的两个概念:user和schema的区别和联系
http://oracle.chinaitlab.com/induction/835839.html
今天重讀ORACLE官方文檔《concepts》,讀到schema的基本概念,對它的理解更進一層,官方文檔中關于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是數據對象的集合,包括像表、視圖、索引、同義詞等等都可以說是schema的對象。但不夠生動,網上有篇文章里面把schema和user的關系用一個形象的比喻闡述得非常透徹,引用如下:
“user即Oracle中的用戶,和所有系統的中用戶概念類似,用戶所持有的是系統的權限及資源;而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并建立普通用戶storm和penguin:
$ sqlplus / as sysdba
SQL> create user storm identified by storm;
User created.
SQL> create user penguin identified by penguin;
User created.
第二步,賦予一些基本的權限給新建的用戶storm和penguin:
SQL> grant connect,create table,resource to storm,penguin;
Grant succeeded.
第三步,以storm用戶登陸,創建一張表并插入數據:
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用戶所建表里面的數據:
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
從以上結果可以看出,用戶 penguin無法查看用戶storm所建表里面的內容,甚至被告知沒有這張表。
第五步,修改當前schema為storm,并繼續查詢:
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表的權限:
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
更簡單的,將當前schema更改為storm,可以簡化查詢過程:
SQL> alter session set current_schema=storm;
Session altered.
SQL> select * from t;
ID
----------
1
這個實驗下來,對user和schema的區別和聯系應該有了進一步的理解了。
?
?
==========
http://langgufu.iteye.com/blog/1469055
有的人還是對schema的真正含義不太理解,現在我再次整理了一下,希望對大家有所幫助。
我們先來看一下他們的定義:
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為數據庫對象的集合,為了區分各個集合,我們需要給這個集合起個名字,這些名字就是我們在企業管理器的方案下看到的許多類似用戶名的節點,這些類似用戶名的節點其實就是一個schema,schema里面包含了各種對象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。
一個用戶一般對應一個schema,該用戶的schema名等于用戶名,并作為該用戶缺省schema。這也就是我們在企業管理器的方案下看到schema名都為數據庫用戶名的原因。Oracle數據庫中不能新創建一個schema,要想創建一個schema,只能通過創建一個用戶的方法解決(Oracle中雖然有create schema語句,但是它并不是用來創建一個schema的),在創建一個用戶的同時為這個用戶創建一個與用戶名同名的schem并作為該用戶的缺省shcema。即schema的個數同user的個數相同,而且schema名字同user名字一一 對應并且相同,所有我們可以稱schema為user的別名,雖然這樣說并不準確,但是更容易理解一些。
一個用戶有一個缺省的schema,其schema名就等于用戶名,當然一個用戶還可以使用其他的schema。如果我們訪問一個表時,沒有指明該表屬于哪一個schema中的,系統就會自動給我們在表上加上缺省的sheman名。比如我們在訪問數據庫時,訪問scott用戶下的emp表,通過select * from emp; 其實,這sql語句的完整寫法為select * from scott.emp。在數據庫中一個對象的完整名稱為schema.object,而不屬user.object。類似如果我們在創建對象時不指定該對象的schema,在該對象的schema為用戶的缺省schema。這就像一個用戶有一個缺省的表空間,但是該用戶還可以使用其他的表空間,如果我們在創建對象時不指定表空間,則對象存儲在缺省表空間中,要想讓對象存儲在其他表空間中,我們需要在創建對象時指定該對象的表空間。
咳,說了這么多,給大家舉個例子,否則,一切枯燥無味!
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的別名的依據。實際上在使用上,shcema與user完全一樣,沒有什么區別,在出現schema名的地方也可以出現user名。
表空間:
一個表空間就是一片磁盤區域,他又一個或者多個磁盤文件組成,一個表空間可以容納許多表、索引或者簇等
每個表空間又一個預制的打一磁盤區域稱為初始區間(initial extent)用完這個區間厚在用下一個,知道用完表空間,這時候需要對表空間進行擴展,增加數據文件或者擴大已經存在的數據文件
?
?
instance是一大坨內存sga,pga....和后臺的進程smon pmon.....組成的一個大的應用。 schema就是一個用戶和他下面的所有對象。。 tablspace 邏輯上用來放objects.物理上對應磁盤上的數據文件或者裸設備。 |
在Oracle中,結合邏輯存儲與物理存儲的概念,我們可以這樣來理解數據庫、表空間、SCHEMA、數據文件這些概念:
數據庫是一個大圈,里面圈著的是表空間,表空間里面是數據文件,那么schema是什么呢?schema是一個邏輯概念,是一個集合,但schema并不是一個對象,oracle也并沒有提供創建schema的語法。
schema:
一般而言,一個用戶就對應一個schema,該用戶的schema名等于用戶名,并作為該用戶缺省schema,用戶是不能創建schema的,schema在創建用戶的時候創建,并可以指定用戶的各種表空間(這點與PostgreSQL是不同,PostgreSQL是可以創建schema并指派給某個用戶)。當前連接到數據庫上的用戶創建的所有數據庫對象默認都屬于這個schema(即在不指明schema的情況下),比如若用戶scott連接到數據庫,然后create table test(id int not null)創建表,那么這個表被創建在了scott這個schema中;但若這樣create kanon.table test(id int not null)的話,這個表被創建在了kanon這個schema中,當然前提是權限允許。
創建用戶的方法是這樣的:
create user 用戶名 identified by 密碼
default tablespace 表空間名
temporary tablespace 表空間名
quota 限額 (建議創建的時候指明表空間名)
由此來看,schema是一個邏輯概念。
但一定要注意一點:schema好像并不是在創建user時就創建的,而是在該用戶創建了第一個對象之后才將schema真正創建的,只有user下存在對象,他對應的schema才會存在,如果user下不存在任何對象了,schema也就不存在了;
?
數據庫:
在oracle中,數據庫是由表空間來組成的,而表空間里面是具體的物理文件---數據文件。我們可以創建數據庫并為其指定各種表空間。
?
表空間:
這是個邏輯概念,本質上是一個或者多個數據文件的集合。
?
數據文件:
具體存儲數據的物理文件,是一個物理概念。
一個數據文件只能屬于一個表空間,一個表空間可以包含一個或多個數據文件。一個數據庫由多個表空間組成,一個表空間只能屬于一個數據庫。
?
若還不理解,下面是我從網上摘的一個比喻,很形象的解釋了什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User,不妨一看。
“我們可以把Database看作是一個大倉庫,倉庫分了很多很多的房間,Schema就是其中的房間,一個Schema代表一個房間,Table可以看作是每個Schema中的床,Table(床)被放入每個房間中,不能放置在房間之外,那豈不是晚上睡覺無家可歸了,然后床上可以放置很多物品,就好比 Table上可以放置很多列和行一樣,數據庫中存儲數據的基本單元是Table,現實中每個倉庫放置物品的基本單位就是床, User就是每個Schema的主人,(所以Schema包含的是Object,而不是User),user和schema是一一對應的,每個user在沒有特別指定下只能使用自己schema(房間)的東西,如果一個user想使用其他schema(房間)的東西,那就要看那個schema(房間)的user(主人)有沒有給你這個權限了,或者看這個倉庫的老大(DBA)有沒有給你這個權限了。換句話說,如果你是某個倉庫的主人,那么這個倉庫的使用權和倉庫中的所有東西都是你的(包括房間),你有完全的操作權,可以扔掉不用的東西從每個房間,也可以放置一些有用的東西到某一個房間,你還可以給每個User分配具體的權限,也就是他到某一個房間能做些什么,是只能看(Read-Only),還是可以像主人一樣有所有的控制權(R/W),這個就要看這個User所對應的角色Role了。”---摘自網絡
| ? |
?
總結
以上是生活随笔為你收集整理的ORACLE中的两个概念:user和schema的区别和联系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delete 误删了全表数据
- 下一篇: 如何使用Proxy模式及Java内建的动