oracle的schema的含義


在現在做的Kraft Catalyst 項目中,Cransoft其中有一個功能就是schema refresh. 一直不理解schema什么意思,也曾經和同事討論過,當時同事就給我舉過一個例子,下面會詳細說的。其實schema是Oracle中的,其他數據庫中不知道有沒有這個概念。

首先,可以先看一下schema和user的定義:
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。這就像一個用戶有一個缺省的表空間,但是該用戶還可以使用其他的表空間,如果我們在創 建對象時不指定表空間,則對象存儲在缺省表空間中,要想讓對象存儲在其他表空間中,需要在創建對象時指定該對象的表空間。

有人舉了個很生動的例子,來說明Database、User、Schema、Tables、Col、Row等之間的關系

“可以把Database看作是一個大倉庫,倉庫分了很多很多的房間,Schema就是其中的房間,一個Schema代表一個房間,Table可以看作是每個Schema中的床,Table(床)就被放入每個房間中,不能放置在房間之外,那豈不是晚上睡覺無家可歸了。

然后床上可以放置很多物品,就好比Table上可以放置很多列和行一樣,數據庫中存儲數據的基本單元是Table,現實中每個倉庫放置物品的基本單位就是床, User就是每個Schema的主人(所以Schema包含的是Object,而不是User)。

其實User是對應與數據庫的(即User是每個對應數據庫的主人),既然有操作數據庫(倉庫)的權利,就肯定有操作數據庫中每個Schema(房間)的 權利,就是說每個數據庫映射的User有每個Schema(房間)的鑰匙,換句話說,如果他是某個倉庫的主人,那么這個倉庫的使用權和倉庫中的所有東西都 是他的(包括房間),他有完全的操作權,可以扔掉不用的東西從每個房間,也可以放置一些有用的東西到某一個房間。還可以給User分配具體的權限,也就是 他到某一個房間能做些什么,是只能看(Read-Only),還是可以像主人一樣有所有的控制權(R/W),這個就要看這個User所對應的角色Role 了”

從定義中我們可以看出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中,數據庫是由表空間來組成的,而表空間里面是具體的物理文件---數據文件。我們可以創建數據庫並為其指定各種表空間。

 

表空間:
     這是個邏輯概念,本質上是一個或者多個數據文件的集合。

 

數據文件:
     具體存儲數據的物理文件,是一個物理概念。

     一個數據文件只能屬於一個表空間,一個表空間可以包含一個或多個數據文件。一個數據庫由多個表空間組成,一個表空間只能屬於一個數據庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM