ORACLE 中SCHEMA的概念以及資料庫,表空間,資料檔案等的區別(轉)

langgufu314發表於2012-03-29

有的人還是對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了。”---摘自網路

相關文章