對大多數人而言,熟練 Oracle 數據庫是比較困難的。在工作中,我見過用了十多年 Oracle 卻沒弄清楚用戶和 SCHEMA 區別的人;也多次遇到工作好幾年卻不能獨自裝好 Oracle 服務端和客戶端的人,但工作數年卻裝不好 SQL Server 的情況從沒見過,我想這或許能在一定程度上說明問題!
在我剛剛接觸 Oracle 的時候,(性格使然)非常想把表空間、SCHEMA 等概念理解透徹,於是查閱了大量帖子(當時工資極低,不舍得花錢買書),有些講得極其晦澀,有些講得甚至有錯,結果耗費了我大量時間和精力,理解上也還是稀里糊塗的。
1、表空間
表空間是 Oracle 數據庫的邏輯划分,每個 Oracle 數據庫至少有一個表空間。數據庫中的表、索引等所有的數據庫對象都存放在指定的表空間中,但表空間主要是為了存放表,所以被稱作表空間。一個表空間只能屬於一個數據庫,表空間還能更進一步分成更細的邏輯存儲單位(段、區、塊)。實際上表空間是由一個或多個數據文件組成的,所以 Oracle 的數據邏輯上是保存在表空間里的,而物理上卻是保存在數據文件中的。
每個 Oracle 數據庫都有且只有一個 SYSTEM 表空間,SYSTEM 表空間在創建數據庫的時候被創建,用於存放數據字典。一般數據庫對象(如表、索引等)不應存放在 SYSTEM 表空間中,而應存放到非 SYSTEM 表空間中去。每個 Oracle 數據庫可以有多個非 SYSTEM 表空間,非 SYSTEM 表空間可以控制分配給每個用戶的空間,即配額。
總的來說,表空間的作用就是管理空間資源的。可根據用途將表空間分為 3 類:
- 永久表空間:用於存放表、索引、視圖、存儲過程等固有的對象和數據。
- 臨時表空間:用於存放短期活動的數據,如排序數據等,不包含任何永久對象。
- 撤銷表空間:用於存放撤銷信息,如數據在修改前就會被放入撤銷表空間。撤銷表空間是自動管理的,撤銷表空間中的段、區都是自動分配和自動釋放的,我們只需要保證磁盤空間有足夠的大小即可。
1.1、創建、修改及刪除表空間
創建表空間:創建表空間的語法選項多達數十個,詳情請參考《Oracle Database SQL Reference》。對普通開發人員而言,如果把所有選項都寫出來,那實在是太麻煩了,好在 Oracle 提供了大量的默認選項,以便簡單、快速的創建表空間。
示例一(創建普通永久表空間):
CREATE TABLESPACE myspace -- 指定表空間名稱
DATAFILE 'D:\ts1.dbf' SIZE 64M,'D:\ts2.dbf' -- 指定數據文件列表,需同時指定初始大小
AUTOEXTEND ON NEXT 8M -- 指定表空間下一次增長的大小
MAXSIZE 1024M -- 指定表空間最大大小
EXTENT MANAGEMENT LOCAL -- 指定為本地管理表空間
SEGMENT SPACE MANAGEMENT AUTO -- 指定為段自動管理
示例二(應該是最簡潔的創建表空間寫法,數據文件被存儲到當前數據庫默認的數據文件存放目錄下):
CREATE TABLESPACE ts DATAFILE 'ts.dbf' SIZE 20M;
修改表空間:一般修改表空間都是因為空間不足,需要擴充,下面將給出三種擴充表空間的方法示例。
示例一(增加數據文件):
ALTER TABLESPACE myspace ADD DATAFILE 'D:\ts3.dbf' SIZE 128M;
示例二(修改數據文件的大小,即修改表空間的大小):
ALTER DATABASE DATAFILE 'D:\ts3.dbf' RESIZE 256M;
示例三(允許數據文件自動增長,及允許表空間自動增長):
ALTER DATABASE DATAFILE 'D:\ts3.dbf' AUTOEXTEND ON NEXT 8M MAXSIZE 512M;
可通過 SQL 修改表空間的狀態,示例:
ALTER TABLESPACE myspace READ ONLY; -- 將 myspace 表空間修改為只讀
ALTER TABLESPACE myspace READ WRITE; -- 將 myspace 表空間修改為讀寫
ALTER TABLESPACE myspace OFFLINE; -- 將 myspace 表空間修改為脫機狀態
ALTER TABLESPACE myspace ONLINE; -- 將 myspace 表空間修改為聯機狀態
刪除表空間:一般來說,除 SYSTEM 表空間外,其它表空間都是可以刪除的。
語法:
DROP TABLESPACE tablespace_name
[INCLUDING CONTENTS [{AND DATAFILES/KEEP DATAFILES}] [CASCADE CONSTRAINTS]];
示例:
-- 刪除表空間(默認只在控制文件和數據字典中刪除與表空間和數據文件相關的信息)
DROP TABLESPACE myspace;
-- 刪除表空間、對象及數據文件
DROP TABLESPACE myspace INCLUDING CONTENTS AND DATAFILES;
-- 刪除表空間、對象、數據文件及約束
DROP TABLESPACE myspace INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
1.2、為對象指定表空間
可以為 Oracle 中的部分對象(如用戶、表、索引)指定存放表空間,如果不特別指定,就會被存儲到默認表空間,事實上默認表空間也是可以修改的。-- 查詢當前數據庫默認永久表空間和默認臨時表空間
SELECT T.PROPERTY_NAME, T.PROPERTY_VALUE
FROM SYS.DATABASE_PROPERTIES T
WHERE t.property_name IN ('DEFAULT_PERMANENT_TABLESPACE','DEFAULT_TEMP_TABLESPACE');
ALTER DATABASE DEFAULT TABLESPACE myspace; -- 修改當前數據庫默認表空間為 myspace
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE ts; -- 修改當前數據庫默認臨時表空間為 ts
示例一(為用戶指定表空間):
CREATE USER fox IDENTIFIED BY tiger DEFAULT TABLESPACE myspace; -- 創建用戶時指定默認表空間
ALTER USER fox DEFAULT TABLESPACE ts; -- 將用戶的默認表空間修改為 ts
示例二(為表指定表空間):
CREATE TABLE t_case(cid NUMBER(9),cname VARCHAR2(50)) TABLESPACE myspace; -- 創建表時指定表空間
ALTER TABLE t_case MOVE TABLESPACE ts; -- 將表移動到 ts 表空間
示例三(為索引指定表空間):
CREATE INDEX uk_name ON t_case(cname) TABLESPACE myspace; -- 創建索引時指定表空間
ALTER INDEX uk_name REBUILD TABLESPACE ts; -- 將索引移動到 ts 表空間
2、SCHEMA
SCHEMA(模式/方案)既無法直接創建,也無法直接刪除,如果不注重理解,甚至都無法感知它的存在;因此對沒有數據庫經驗的人來說,的確不太好理解。demo.t_staff
、owner.object
之類的寫法是非常常見的,不知道大家是否真的理解;我在接觸數據庫之后很長一段時間都以為這里的 demo 和 owner 指的是用戶名,但實際上這里的 demo 和 owner 都是指 SCHEMA 名。
SCHEMA 是數據庫中用戶所擁有對象的集合,為了區分各個集合,我們需要給每個集合都取一個名字。常見的數據庫如 Oracle、SQL Server 等,都會在創建用戶后給用戶一個缺省的 SCHEMA,且名稱與用戶名相同。Oracle 中雖然有 CREATE SCHEMA 語句,但是它並不是用來創建 SCHEMA 的,要創建 SCHEMA 只能通過創建用戶的方式;這樣一來用戶與 SCHEMA 就一一對應了,所以即便分不清用戶名和 SCHEMA 名一般也不會有問題。
訪問數據庫對象的時候,如果沒有指明該對象屬於哪一個 SCHEMA,系統就會自動在對象名前面加上缺省的 SCHEMA 名,也就是說對象的完整名稱為 SCHEMA.object。類似的如果創建對象時不指定該對象的 SCHEMA,系統也會為該對象指定用戶的缺省 SCHEMA。不同的 SCHEMA 之間沒有直接的關系,它們的表可以同名,也可以互相引用(前提是必須有權限),如果沒有操作別的 SCHEMA 的根權,那么用戶就只能操作它自己的 SCHEMA 中的對象。
3、用戶
要想訪問某個數據庫,就得先登錄那個數據庫,而登錄必然需要用戶名和密碼,這很好理解。要想訪問某個數據庫對象,也得先知道這個對象所屬用戶,盡管訪問對象時實際是用 SCHEMA 來限定對象名。
3.1、創建用戶、刪除用戶
創建用戶:創建用戶的語法選項也有很多,詳情請參考《Oracle Database SQL Reference》。同樣 Oracle 也提供了大量的默認選項,以便簡單、快速的創建用戶。示例:
-- 創建一個用戶 user1,並設置密碼為 user1。注意:密碼不能太簡單,否則不能創建
CREATE USER user1 IDENTIFIED BY user1;
-- 創建一個用戶 user2,並指定默認表空間為 myspace,同時指定臨時表空間為 temp,一般不需要建立臨時表空間和撤銷表空間,除非要把它們轉移到其它磁盤以提高性能
CREATE USER user2 IDENTIFIED BY user2
DEFAULT TABLESPACE myspace TEMPORARY TABLESPACE temp;
刪除用戶:當某些用戶不再被需要時,可以將其刪除。示例:
DROP USER user1; -- 刪除 user1 用戶
DROP USER user2 CASCADE; -- 刪除 user2 用戶,並刪除 user2 擁有數據庫對象
3.2、修改用戶口令和鎖定狀態
如果你忘記了某個用戶的密碼,可以通過 DBA 用戶來修改它的密碼。示例:
ALTER USER fox IDENTIFIED BY fox123; -- 把 fox 用戶的密碼改為 fox123
ALTER USER fox PASSWORD EXPIRE; -- 強制 fox 用戶的口令過期
ALTER USER fox ACCOUNT LOCK; -- 鎖定 fox 用戶
ALTER USER fox ACCOUNT UNLOCK; -- 給 fox 用戶解鎖
ALTER USER fox QUOTA 128M ON users; -- 設置 fox 用戶在 users 表空間的配額
4、權限
權限是相對用戶來說的,權限允許用戶執行特定的數據庫動作或訪問特定的數據庫對象。如果你明知某個用戶擁有某張表,結果你訪問的時候卻報“表或視圖不存在”,那說明你沒有訪問這個表的權限。但在 Oracle 里沒權限的操作並不總是報這個錯,有可能是別的錯或不報錯,所以如果對 Oracle 的權限沒有一個系統性的認識,有時候是很難甄別某些錯誤的。
Oracle 10g 中的權限很多,有 100 多種,但可清晰的分為兩類:
- 系統權限:訪問數據庫的能力,允許用戶執行特定的數據庫動作,如連接實例、創建表、創建視圖、創建觸發器等。
- 對象權限:維護數據庫的能力,允許用戶操作特定的數據庫對象,如對數據的增刪改查、執行過程、修改表結構等。每種對象的權限都不相同。對象的所有者擁有對象的所有權限。對象的所有者可以將自己的對象權限賦予其它用戶或角色。
4.1、角色
角色就是一組相關權限的命令集合,使用角色的主要目的就是為了簡化權限的管理,同時也實現了動態權限管理。角色主要分為兩類,預定義角色和自定義角色。Oracle 10g 提供了數十個預定義角色,常見的角色有 CONNECT、RESOURCE、DBA、PUBLIC 等。鑒於普通開發中,程序員無需對角色深入了解,這里僅給出幾個自定義角色的簡單示例:
CREATE ROLE myrole NOT IDENTIFIED; -- 創建角色,不需要驗證
CREATE ROLE role1 IDENTIFIED BY role1; -- 創建角色,要驗證
GRANT INSERT,DELETE,UPDATE,SELECT ON demo.t_staff TO myrole; -- 為角色授權
GRANT myrole TO demo; -- 為用戶分配角色
DROP ROLE myrole; -- 刪除角色
4.2、授權、撤銷授權
授權:既可以通過角色為用戶授權,也可以直接授予用戶某個特定權限。Oracle 對權限管理比較嚴格,普通用戶之間默認是不能互相訪問的,需要互相授權。
示例一(通過角色為用戶授權,當用戶擁有某個角色后,相應的也就具備了該角色所包含的所有權限):
GRANT CONNECT,RESOURCE,DBA TO fox; -- 授予 fox 用戶 CONNECT,RESOURCE,DBA 三個角色
ALTER USER fox DEFAULT ROLE CONNECT; -- 設置用戶的默認角色
ALTER USER fox DEFAULT ROLE ALL EXCEPT DBA; -- 除了這個角色其它的角色都授予
ALTER USER fox DEFAULT ROLE NONE;
示例二(直接授予用戶權限,擁有下面三個授權之后,用戶才能對表進行 CRUD 操作):
GRANT CREATE SESSION TO fox; -- 會話權限,有這個權限之后用戶才能登錄
GRANT CREATE TABLE TO fox; -- 建表權限,有這個權限之后用戶才能創建表
GRANT UNLIMITED TABLESPACE TO fox; -- 不受限表空間權限,可以對數據庫中所有表空間進行操作
示例三(進行 DML 操作的對象權限,對象權限可以控制到列,但查詢和刪除不能控制到列):
GRANT SELECT ON demo.t_staff TO fox; -- 把對 t_staff 表的查詢權限授予 fox
GRANT ALL ON demo.t_staff TO fox; -- 把對 t_staff 表的增刪改查、索引、外鍵等權限授予 fox
GRANT UPDATE(staff_name) ON demo.t_staff TO fox; -- 把對 t_staff 表中 staff_name 列的修改權限授予 fox
GRANT INSERT(staff_name) ON demo.t_staff TO fox; -- 把對 t_staff 表中 staff_name 列的插入權限授予 fox
一些常見的授權語句補充:
GRANT CREATE SESSION TO fox; -- 授予 fox 用戶創建 session 的權限,即登錄權限
GRANT UNLIMITED TABLESPACE TO fox; -- 授予 fox 用戶使用表空間的權限
GRANT CREATE TABLE TO fox; -- 授予 fox 用戶創建表的權限
GRANT DROP ANY TABLE TO fox; -- 授予 fox 用戶刪除表的權限,ANY 表示用戶在所有模式中都有該權限
GRANT INSERT ANY TABLE TO fox; -- 授予 fox 用戶插入表數據的權限
GRANT UPDATE ANY TABLE TO fox; -- 授予 fox 用戶修改表數據的權限
GRANT SELECT ANY TABLE TO fox; -- 授予 fox 用戶查詢表的權限
撤銷授權:與授權語法結構相同,只需要將 GRANT 換成、TO 換成 FROM 即可。另外,撤銷對象權限的用戶必須是要撤銷對象權限的對象的擁有者。
示例:
REVOKE CREATE SESSION FROM fox;
REVOKE CREATE TABLE FROM fox;
REVOKE SELECT ON demo.t_staff FROM fox;
REVOKE ALL ON demo.t_staff FROM fox;
另外,可以在授予對象權限語句后面加上WITH GRANT OPTION
,這樣將權限授予某用戶時,該用戶也擁有了授予其他用戶對象權限的功能。這種寫法被稱之為及聯授予,撤銷權限的時候也會及聯刪除,換成WITH ADMIN OPTION
就不會級聯刪除了。
5、總結
本文主要講述了 Oracle 中最基本的 4 個概念(也可以說是 5 個,因為角色也是一個),並重點講述了創建及刪除表空間和用戶。其實這些操作對普通開發人員來說並不常用,但必須了解,因為這些是數據庫基礎中的基礎。
Oracle 中的理論概念可以很深入,尤其是 Oracle 的體系結構,相當復雜,不過我認為對普通開發人員來講完全沒必要搞懂 Oracle 的體系結構。事實上像體系結構里的 SGA、PGA 等概念我自己也是淺嘗輒止、不求甚解,畢竟咱不是研究 Oracle 的。
5.1、通過類比來理解概念
起初,我也覺得表空間、模式等概念不太好理解。等我終於理解的差不多了,我發現可以類比現實中的事物來理解:如果說程序員(Programer)是管道工,那 Oracle 數據庫(Database)就是小區,而表空間(Tablespace)就是小區內的每幢房子,模式(Schema)就是小區內的每戶人家,用戶(User)就是房奴或租房者,權限(Privilege)就是房子的鑰匙,角色(Role)就是物業或房東之類的中介。
於是乎:小區里有一或多幢房子,正如數據庫里有一或多個表空間;一幢房子可以住多個人,一個人也可以擁有多套房子,正如一個表空間可以被多個用戶使用,一個用戶也可以使用多個表空間;某個人一旦成了房奴或交了房租,他就有了住所——家,比如他叫張三,那他的房子就被認為是張三的家,正如一旦創建了用戶,就有了與用戶同名的模式;房奴即便買了房子也得有鑰匙才能回家,管道工要想去他家就得先得到房奴或中介的許可,正如用戶要訪問數據庫中某個模式下的對象得先登錄數據庫,其它用戶要訪問就得先取得授權;
5.2、創建用戶的一般步驟
實際項目開發中,我一般都是先創建表空間,然后創建用戶並指定密碼和默認表空間,最后再授予用戶必需的權限。表空間這塊兒我一般只是粗略的評估下應用的數據情況,設置下表空間的初始大小和增長策略,專業的 DBA 往往還會仔細考慮表空間配額。我一般會授予用戶比較大權限(其實這並不好),專業的 DBA 還會對用戶權限做更加精細化的管理。
下面給出創建用戶的一般步驟:
1、登錄管理員。首先需要以 sysdba 的身份登錄一個已有用戶,或者以普通身份登錄一個擁有 DBA 角色的用戶(估計是系統權限CREATE USER
的作用,未驗證),才有權限繼續進行后面的操作。
2、創建表空間。指定表空間的名稱為demo_space
,數據文件為D:\demo_space.dbf
,初始大小為 64 MB,下一次增長 8 MB,最大大小為 1024 MB,區管理為本地管理,主要是為提高數據庫分配空間的效率。
CREATE TABLESPACE demo_space DATAFILE 'D:\demo_space.dbf'
SIZE 64m AUTOEXTEND ON NEXT 8m MAXSIZE 1024m EXTENT MANAGEMENT LOCAL;
3、創建新用戶。執行用戶為demo_user
,用戶密碼為demo_pwd
,默認表空間為demo_space
。
CREATE USER demo_user IDENTIFIED BY demo_pwd DEFAULT TABLESPACE demo_space;
4、授予用戶權限。
GRANT CONNECT,RESOURCE TO demo_user;
徹底刪除用戶及用戶數據和表空間及數據文件
DROP USER demo_user CASCADE;
DROP TABLESPACE demo_space INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
本文鏈接:http://www.cnblogs.com/hanzongze/p/oracle-basicconcept.html
版權聲明:本文為博客園博主 韓宗澤 原創,作者保留署名權!歡迎通過轉載、演繹或其它傳播方式來使用本文,但必須在明顯位置給出作者署名和本文鏈接!本人初寫博客,水平有限,若有不當之處,敬請批評指正,謝謝!