oracle中的數據庫、用戶、方案、表空間、表對象之間的關係

最近在學習oracle,給我的第一個感覺就是甲骨文的體系太龐大了(因爲我之前一直使用的是mysql,輕量級的數據庫)。而開始遇到的最糾結的問題,就是怎麼理清oracle中數據庫、用戶、方案、表空間、表對象之間的關係,如果這個問題搞不清楚,接下來的學習也就會雨裏霧裏了。所以,下定決心一定把它研究清楚,便開始了搜索各種資料的旅程。


1.首先,我們先看看oracle和sqlserver的一些區別吧
oracle中的一個數據庫就是一個實例,而在sqlserver中,在一個實例下面可以建多個數據庫。從用戶方面來看,oracle的一個用戶就是一個Schema(方案,雖然這麼說不太準確,但是易於理解,後面我會詳細說明這個問題),所有的表都屬於不同的用戶,一個用戶要訪問另一個用戶的表,需要有授權,而在sqlserver中,表是在數據庫中創建的,它並不屬於某個用戶。
oracle的結構是===實例->用戶->表,表是屬於某個用戶的(但是訪問時實際上用的是schema進行索引表的)所以在oracle下建表空間,建用戶,設置用戶的默認表空間,在用戶下建表;
sqlserver下,結構是===實例->庫->表,用戶與庫、表 獨立,sqlserver下是建庫,在庫下建表,建用戶,設置用戶訪問庫的權限。
《也可以這麼理解,oracle中有數據庫,但是不同於sqlserver,oracle的一個實例只有一個數據庫,數據庫系統的基本信息也保存在這個數據庫中,不像sqlserver保存在單獨的master數據庫中》


2.現在我們再看看錶空間和方案之間的關係吧
其實它們之間的關係就是沒有關係,在一個instance下可以有多個用戶,每個用戶只能有一個schema。很多人包括我一直在想的問題就是既然schema是用來存放table object的,而表空間也是存放table object,它們之間是不是存在着某種關係呢,但是結果就是沒有關係。在數據庫創建一個用戶後,並給以這個用戶創建表或者其他對象的權限,這時還沒有模式存在。只有當這個用戶利用這些權限創建了屬於自己的第一個對象時,oracle爲這個用戶創建一個schema,來容納這個對象以及以後創建的對象。同一個schema的objects可以存儲在不同的tablespace(表空間)中,同樣,tablespace也可以存儲不同schema的objects。schema就是一個用戶和它下面的所有對象,而表空間邏輯上用來放objects,物理上對應磁盤上的數據文件或者裸設備。


3.再看方案和用戶之間的關係吧
從定義中,我們可以看出方案爲數據庫對象的集合,爲了區分各個集合,我們需要給這個集合起個名字,這些名字也就是我們在企業管理器的方案下看到的許多類似用戶名的節點,這些類似用戶名的節點其實就是一個schema,schema裏面包含了各種對象如tables,views,sequences,stored procedures,synonyms,indexes,clusters,and database links。
一個用戶一般對應一個schema,該用戶的schema名等於用戶名,並作爲該用戶缺省的schema,這就是我們在企業管理器的方案下看到的schema名都是數據庫用戶名的原因。
oracle數據庫中不能新創建一個schema,要想創建一個schema,只能通過創建一個用戶的方法解決(oracle中的create schema語句不是用來創建schema的)。
schema的個數通user的個數相同,而且schema名字和user名字一一對應並且相同,所以我們稱schema爲user的別名,雖然不準確,但是容易理解。
在授權情況下,一個用戶可以使用其他的schema,一個用戶只有一個缺省的schema。如果我們訪問一個表時,沒有指明該表屬於哪一個schema中的,系統就會自動給我們在表上加上缺省的sheman名。比如我們在訪問數據庫時,訪問scott用戶下的emp表,通過select * from emp; 其實,這sql語句的完整寫法爲select * from scott.emp。
在數據庫中一個對象的完整名稱爲schema.object,而不屬user.object。類似如果我們在創建對象時不指定該對象的schema,在該對象的schema爲用戶的缺省schema。這就像一個用戶有一個缺省的表空間,但是該用戶還可以使用其他的表空間,如果我們在創建對象時不指定表空間,則對象存儲在缺省表空間中,要想讓對象存儲在其他表空間中,我們需要在創建對象時指定該對象的表空間。
oracle中的schema就是指一個用戶下所有對象的集合,schema本身不能理解成一個對象,oracle並沒有提供創建schema的語法,schema也並不是在創建user時就創建,而是在該用戶下創建第一個對象之後schema也隨之產生,只要user下存在對象,schema就一定存在,user下如果不存在對象,schema也不存在;
這一點類似於temp tablespace group,另外也可以通過oem來觀察,如果創建一個新用戶,該用戶下如果沒有對象則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是一個邏輯概念,是一個集合,但schema不是一個對象,oracle也並沒有提供創建schema的語法。表空間也是個邏輯概念,本質上是一個或者多個數據文件的集合。
數據文件是一個物理概念,是具體存儲數據的物理文件。一個數據文件只能屬於一個表空間,一個表空間可以包含一個或多個數據文件,一個數據庫由多個表空間組成,但是一個表空間只能屬於一個數據庫。


下面有個很形象的比喻,是從網上摘的,不妨一看:
我們可以把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了。


ps:到此,這個問題基本上算是理清了,小弟剛接觸oracle,文章中有不足或者紕漏之處,還請高手耐心指導,謝謝!


轉自:http://blog.csdn.net/blognkliming/article/details/7613189

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章