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


原文http://blog.csdn.net/nkliming/article/details/7613189
1.首先是ORACLE的整體結構。
oracle中的一個數據庫就是一個實例.
oracle的一個用戶就是一個Schema(即方案).
oracle的結構是===
          實例->用戶->表(用戶屬於數據庫實例,表屬於某個用戶)

所以在oracle下建立 建表空間,建用戶,設置用戶的默認表空間,在用戶下建表;
 

--創建數據表空間
create tablespace CICI
logging
datafile 'D:\oraclexe\app\oracle\oradata\CICI\CICI.DBF'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;

--創建用戶並指定表空間

CREATE USER cici IDENTIFIED BY cici
PROFILE DEFAULT
DEFAULT 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 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了。
 
         



免責聲明!

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



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