原文http://blog.csdn.net/nkliming/article/details/7613189
1.首先是ORACLE的整體結構。
oracle中的一個資料庫就是一個執行個體.
oracle的一個使用者就是一個Schema(即方案).
oracle的結構是===
執行個體->使用者->表(使用者屬於資料庫執行個體,表屬於某個使用者)
所以在oracle下建立 建資料表空間,建使用者,設定使用者的預設資料表空間,在使用者下建表;
--建立資料資料表空間create tablespace CICIloggingdatafile 'D:\oraclexe\app\oracle\oradata\CICI\CICI.DBF'size 32mautoextend onnext 32m maxsize 2048mextent management local;--建立使用者並指定資料表空間CREATE USER cici IDENTIFIED BY ciciPROFILE DEFAULTDEFAULT TABLESPACE CICI ACCOUNT UNLOCK;-- 為使用者賦予許可權GRANT connect, resource TO cici;grant create session to cici;-- 登入使用者sql>conn請輸入使用者名稱 cici請輸入密碼 XXXXXX---建立表create table A(name varchar2(100) primary key);-- 查詢表select * from cici.A;
2.現在我們再看看錶空間和方案之間的關係吧。
在一個instance下可以有多個使用者,每個使用者只能有一個schema.但是資料表空間和schema之間沒有關係.
schema產生的條件:在資料庫建立一個使用者後,並給以這個使用者建立表或者其他對象的許可權,這時還沒有shcema存在。只有當這個使用者利用這些許可權建立了屬於自己的第一個對象時,oracle為這個使用者建立一個schema,來容納這個對象以及以後建立的對象。
DB建立好以後,實際上oracle是一個一個的DBF檔案,然後N個DBF檔案組成一個資料表空間:
一個資料庫叫cici,
cici下使用者使用的資料表空間有3個: u1, u2, u3
其中
u1由d:\1.dbf組成
u2由d:\11.dbf d:\22.dbf組成
u3由 d:\33.dbf組成
同一個schema的objects可以儲存在不同的tablespace(資料表空間)中
同樣,一個tablespace也可以儲存不同schema的objects。
schema就是一個使用者和它下面的所有對象,而資料表空間邏輯上用來放objects,物理上對應磁碟上的資料檔案或者裸裝置。3.再看方案和使用者之間的關係吧。
方案為資料庫物件的集合,方案的名稱為使用者的名稱。
schema裡麵包含了各種對象如tables,views,sequences,stored procedures,synonyms,indexes,clusters,and database links。
oracle資料庫中不能新建立一個schema,
要想建立一個schema,只能通過建立一個使用者的方法解決(oracle中的create schema語句不是用來建立schema的)。schema的個數通user的個數相同,
在授權情況下,一個使用者可以使用其他的schema,一個使用者只有一個預設的schema。
如果我們訪問一個表時,沒有指明該表屬於哪一個schema中的,系統就會自動給我們在表上加上預設的sheman名。
比如我們在訪問資料庫時,訪問scott使用者下的emp表,通過select * from emp; 其實,這sql語句的完整寫法為select * from scott.emp。
我們需要在建立對象時指定該對象的資料表空間。oracle中的schema就是指一個使用者下所有對象的集合,schema本身不能理解成一個對象,oracle並沒有提供建立schema的文法,schema也並不是在建立user時就建立,而是在該使用者下建立第一個對象之後schema也隨之產生,只要user下存在對象,schema就一定存在,user下如果不存在對象,schema也不存在;這一點類似於temp tablespace group,另外也可以通過oem來觀察,如果建立一個新使用者,該使用者下如果沒有對象則schema不存在,如果建立一個對象則和使用者同名的schema也隨之產生。下面是一些例子SQL> Gruant dba to scottSQL> 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/managerConnected.SQL> select * from test;NAME----------systemSQL> ALTER SESSION SET CURRENT_SCHEMA = scott; --改變使用者預設schema名Session altered.SQL> select * from test;NAME----------scottSQL> select owner ,table_name from dba_tables where table_name=upper('test');OWNER TABLE_NAME------------------------------ ------------------------------SCOTT TESTSYSTEM 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了。