本文主要包括:
· 介紹創建用戶
· 了解如何使用特權來確保用戶能夠在數據庫中執行任務
· 介紹兩種特權類型:系統特權和對象特權
· 介紹系統特權怎樣允許執行操作,例如執行 DDL 語句
· 介紹對象特權怎樣允許執行操作,例如執行 DML 語句
· 介紹如何將特權組合在一起形成角色
一、 用戶
數據庫使用表空間來存儲對象,其中可以包含表、類型和 PL/SQL 代碼等
表空間存儲在數據文件 (datafile) 中
1. 創建用戶
語法:
CREATE USER user_name IDENTIFIED BY password
[DEFAULT TABLESPACE default_tablespace]
[TEMPORARY TABLESPACE temporary_tablespace];
可以從 user_users 查詢默認表空間和默認臨時表空間
2. 修改用戶密碼
ALTER USER user_name IDENTIFIED BY password;
PASSWORD 可以用來修改當前登錄用戶的密碼
3. 刪除用戶
DROP USER user_name;
注:如果要刪除的用戶模式中包含任何表或其他項,就必須在 DROP USER
語句中,在要刪除的用戶名後面加上關鍵字 CASCADE
二、 系統特權
系統特權(system privilege)允許用戶在數據庫中執行特定的操作,比如執行 DDL 語句
常用的系統特權如下表
特權組合在一起形成角色(role),授予用戶的兩種有用的角色是 CONNECT 和 RESOURCE<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+Q09OTkVDVCDUytDt08O7p8GsvdO1vcr9vt2/4qOsUkVTT1VSQ0Ug1MrQ7dPDu6e0tL2ouPfW1sr9vt2/4rbUz/OjrMjnse2hotDywdC1yDwvcD4KPHA+MS4gz/LTw7unytrT6M+1zbPM2MioPC9wPgo8cD5HUkFOVCBDUkVBVEUgU0VTU0lPTixDUkVBVEUgVVNFUixDUkVBVEUgVEFCTEUgVE8gdXNlcl9uYW1lOzwvcD4KPHA+16Kjusq508MgV0lUSCBBRE1JTiBPUFRJT04g0aHP7qOs1eLR+bG7ytrT6LXE08O7p77Nv8nS1LDR1eLW1szYyKjU2cra0+jG5Mv808O7pzwvcD4KPHA+R1JBTlQgRVhFQ1VURSBBTlkgUFJPQ0VEVVJFIFRPIHVzZXJfbmFtZVdJVEggQURNSU4gT1BUSU9OOzwvcD4KPHA+16Kjus2ouf29q9K71tbM2MioytrT6CBQVUJMSUOjrL7Nv8nS1L2ruMPM2MioytrT6Mv509DTw7unPC9wPgo8cD5DT05ORUNUIC8gQVMgU1lTREJBPC9wPgo8cD5HUkFOVCBFWEVDVVRFIEFOWSBQUk9DRURVUkUgVE8gClBVQkxJQzs8L3A+CjxwPjIuILzssunK2tPo08O7p7XEz7XNs8zYyKg8L3A+CjxwPs2ouf2y6dGvIHVzZXJfc3lzX3ByaXZpbGVnZSC/ydLUvOyy6cSzuPbTw7unvt/T0MTE0KnPtc2zzNjIqDwvcD4KPHA+My4gyrnTw8+1zbPM2MioPC9wPgo8cD7Tw7unsbvK2tPoz7XNs8zYyKjWrrrzo6y+zb/J0tTKudPD1eLW1szYyKjAtNa00NDM2LaotcTIzs7xo6zI57S0vajTw7untcg8L3A+CjxwPrWr1rTQ0MO709Cxu8ra0+i1xM+1zbPM2Mioo6yy2df3u+HKp7DcPC9wPgo8cD40LiCzt8/608O7p7XEz7XNs8zYyKg8L3A+CjxwPr/J0tTKudPDIFJFVk9LRSDT777ks7fP+sSzuPbTw7untcTPtc2zzNjIqDwvcD4KPHA+Q09OTiAvIEFTIFNZU0RCQTwvcD4KPHA+UkVWT0tFIENSRUFURSBUQUJMRSBGUk9NIHVzZXJfbmFtZTs8L3A+Cgo8cD7I/aGiILbUz/PM2MioPC9wPgo8cD621M/zzNjIqKOob2JqZWN0IHByaXZpbGVnZaOp1MrQ7dPDu6e21Mr9vt2/4rbUz/PWtNDQzNi2qLXEstnX96OswP3I57bUse3WtNDQIERNTCDT777kPC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20141201/20141201092221106.png" alt="\">
1. 向用戶授予對象特權
可以使用 GRANT 語句向用戶授予對象特權
范例:以 store 用戶的身份連接到數據庫,並向 steve 用戶授予以下特權:
對 products 表的 SELECT、INSERT、UPDATE對象特權以及對表 employees 的 SELECT 特權
CONN store/store_password
GRANT SELECT,INSERT,UPDATE ON store_products TO steve;
GRANT SELECT ON store.employees TO steve;
注:可以使用 GRANT 選項,這樣被授予的用戶就可以把這種特權再授予其他用戶
GRANT SELECT ON store.customers TO steve WITH GRANT OPTION;
2. 檢查已授予的對象特權
通過查詢 user_tab_privs_made 可以檢查某個用戶對哪些表向其他用戶開放了哪些對象特權
范例:檢索 table_name 為 PRODUCTS 的行
SELECT grantee,table_name,grantor,privilege,grantable,hierarchy
FROM user_tab_privs_made
WHERE table_name="PRODUCTS';
通過查詢 user_col_privs_made 可以檢查某個用戶對哪些列對象開放了哪些特權
范例:對 user_col_privs_made 進行查詢
SELECT grantee,table_name,column_name,grantor,privilege,grantable
FROM user_col_privs_made
ORDER BY column_name;
注:
· 系統特權的傳遞使用 WITH ADMIN OPTION
· 對象特權的傳遞使用 WITH GRANT OPTION
3. 檢查已接受的對象特權
通過查詢 user_tab_privs_recd表可以檢查某個用戶被授予了哪些表上的哪些對象特權
范例:以 steve 用戶的身份連接到數據庫,並對 user_tab_privs_recd 進行查詢
SELECT owner,table_name,grantor,privilege,grantable,hierarchy
FROM user_tab_privs_recd
ORDER BY table_name,privilege;
通過查詢 user_col_privs_recd可以檢查某個用戶被授予了哪些列的對象特權
范例:對 user_col_privs_recd 進行查詢
SELECT owner,table_name,column_name,grantor,privilege,grantable
FROM user_col_privs_recd;
4. 使用對象特權
用戶被授予對象特權之後,就可以使用這種特權來執行特定的任務,
例如, steve 用戶對 store.customers 具有 SELECT 特權
CONNECT steve/button
SELECT * FROM store.customers;
注:如果 steve 試圖對 purchases 表 (steve 對該表沒有任何權限) 進行檢索,數據庫就會報錯
SELECT * FROM store.purchases;
5. 創建同義詞
范例:以 system 用戶的身份連接到數據庫,並將 CREATE SYNONYM 系統特權授予 steve 用戶
CONN system/oracle
GRANT CREATE SYNONYM TO steve;
范例:以 steve 身份連接到數據庫,並執行一條 CREATE SYNONYM 語句,為 store.customers 表創建同義詞
CONN steve/button
CREATE SYNONYM customers FOR store.customers;
6. 創建公共同義詞
可以為表創建公共同義詞 (public synonym) ,在創建公共同義詞之後,所有的用戶都可以
看到這個同義詞,下面這4條語句執行以下任務:
· 以 system 用戶的身份連接到數據庫
· 將 CREATE PUBLIC SYNONYM 系統特權授予 store 用戶
· 以 store 用戶的身份連接到數據庫
· 為 store.products 創建公共同義詞
CONNECT system/oracle
GRANT CREATE PUBLIC SYNONYM TO store;
CONN store/store_password
CREATE PUBLIC SYNNONYM products FOR store.products;
7. 撤銷用戶的對象特權
可以使用 REVOKE 語句撤銷某個用戶的對象特權
范例:以 store 用戶的身份連接到數據庫,並撤銷 steve 用戶對 products 表的 INSERT 特權
CONN store/store_password
REVOKE INSER ON products FROM steve;
注:
· 系統特權在撤銷時,該用戶授予其它用戶的特權不會消失
· 對象特權再撤銷時,該用戶授予其它用戶的特權也會消失
四、 角色
角色就是一組特權,可以分配給用戶或其它角色,角色的優點可以總結為如下幾點:
· 並不是一次一個地將特權直接授予用戶,而是先創建角色,向角色授予一些特權,
然後再將角色授予多個用戶和角色
· 在增加或刪除角色的某種特權時,被授予該角色的所有用戶和角色都會自動獲得
新增加的特權或自動失去這種特權
· 可以將多個角色授予用戶或角色
· 可以為角色設置密碼
1. 創建角色
要創建角色,必須具有 CREATE ROLE 系統特權
2. 為角色授權
3. 將角色授予用戶
4. 檢查授予用戶的角色
通過查詢 user_role_privs 可以檢查已經授予用戶哪些角色
注:
· 密碼保護的角色是禁用的,必須輸入密碼才能使用該角色
· 創建角色的那個用戶也會被授予該角色
5. 檢查授予角色的系統特權
通過查詢 role_sys_privs 可以檢查已經授予角色哪些系統特權
6. 檢查授予角色的對象特權
通過查詢 role_tab_privs 可以檢查已經授予角色哪些對象特權
7. 使用已授予角色的特權
對於無密碼保護的角色,通過角色將特權授予用戶之後,用戶連接到數據庫後就
可以立即使用這種特權了;
對於密碼保護的角色,用戶必須輸入角色密碼才能使用這個角色
SET ROLE role_name IDENTIFIED BY role_password;
8. 啟用和禁用角色
可以禁用角色,ALTER ROLE 語句可以用來對角色進行修改,使其變為非默認角色
范例:以 system 用戶身份連接到數據庫,並對 john 用戶進行修改,使 hr_manager 不再是默認角色
CONN system/oracle
ALTER USER john DEFAULT ROLE ALL EXCEPT hr_manager;
范例:使用 SET ROLE 命令啟用 hr_manager 角色
SET ROLE hr_manager;
范例:將 hr_manager 角色設置為默認角色,它在退出登錄後仍然保留
CONN system/oracle
ALTER USER john DEFAULT ROLE hr_manager;
范例:可以將角色設置為 NONE ,這表示沒有角色
CONN john/brown
SET ROLE NONE;
范例:將角色設置為除 hr_manager 之外的任何角色
SET ROLE ALL EXCEPT hr_manager;
9. 撤銷角色
REVOKE 語句可以用來撤銷角色
REVOKE role_name FROM user_name;
10. 從角色中撤銷特權
REVOKE 語句可以用來從角色中撤銷某種特權
REVOKE ALL ON table_name FROM role_name;
11. 刪除角色
DROP ROLE 語句可以用來刪除角色
DROP ROLE role_name;