【關鍵術語】
Role 角色
Enabling role 角色生效
Disabling role 角色失效
Predefined roles 預定義角色
Application roles 應用角色
Default roles 默認角色
3.1 角色概述 3.1.1 角色的作用● 簡化權限管理:
使用角色可簡化權限管理。可以将一些權限授予某個角色,然後将該角色授予每個用戶,而不是将同一組權限授予多個用戶。
● 動态進行權限管理:
如果修改了與某個角色關聯的權限,則授予該角色的所有用戶都會立即自動獲得修改過的權限。
● 有選擇地使用權限:
通過啟用或禁用角色可以暫時打開或關閉權限。啟用角色還可以用來驗證用戶是否已授予該角色。
當建立用戶時,用戶沒有任何權限。為使用戶可以連接到數據庫并執行各種操作,必須 為其授予相應的系統權限或對象權限。假定要使用戶 A、B、C 能夠連接到數據庫,并具有創建表的權限和可以在 SCOTT.EMP 表上執行 INSERT、UPDATE 操作,那麼需要進行 12次授權操作。如圖 P1-1 所示。
如果将來要收回用戶 A、B、C 的 INSERT ON SCOTT.EMP 權限,則分别需要從每個用 戶處收回該權限,共需要三次收回權限的操作。
因為用戶 A,B,C 具有相似的權限需求,我們可以通過角色簡化授權和收權操作的次數。假定使用角色,首先可以将這四種權限授予角色 OE,然後将該角色分别授予 A,B,C 用戶,隻需要進行 7 次授權操作,顯然可以降低授權次數。如圖 P1-2 所示。
如果要回收用戶 A、B、C 的 INSERT ON SCOTT.EMP,那麼隻需要從角色 OE 處收回INSERT ON SCOTT.EMP 對象權限就可以了。
所以,角色使得權限的授予和回收變得方便和簡化了。
結論:
在大多數系統中,将必需的權限一個一個授予每一個用戶是很耗時的工作,而且很有可
能會出錯。Oracle 軟件通過角色可實現簡單且受控的權限管理。角色是可授予用戶或其它
角色的、由相關權限組成的一些命名組。角色的設計目的是為了簡化數據庫中的權限管理,
從而可提高數據庫的安全性。
角色特性:
角色是一組相關權限的命名集合,使用角色最主要的目的是簡化權限管理。當建立數據
庫、安裝了數據字典和 PL/SQL 包之後,Oracle 會自動建立一些預定義角色。下面介紹一
些 Oracle 常用的預定義角色:
功能角色
已經創建了一些授權您管理特殊功能的其它角色(如果已安裝這些功能)。例如,
XDBADMIN 包含管理擴展标記語言(XML) 數據庫(如果已安裝此功能)所需的權限。
AQ_ADMINISTRATOR_ROLE 提供管理高級隊列的權限。HS_ADMIN_ROLE 包括管理異種服務所需的權限。在沒有 Oracle 技術支持協助的情況下,一定不能改變授予這些功能角色的權限,因為這樣做可能會無意禁用所需的功能
1)CONNECT 角色� Oracle 10g R2之前:
� Oracle 10g R2之後:
oracle CONNECT 角色現在隻有這一個權限: CREATE SESSION
如果想還原原來的 oracle CONNECT 角色的設置,Oracle 提供了下面的腳本:
$ORACLE_HOME/rdbms/admin/rstrconn.SQL.
2)RESOURCE 角色從 role_sys_privs 中看 ORACLE resource 角色的權限:
SQL> select PRIVILEGE from role_sys_privs where role='RESOURCE';
當把 ORACLE resource 角色授予一個 user 的時候,不但會授予 ORACLE resource 角色
本身的權限,而且還有 unlimited tablespace 權限。
1 SQL> conn desk 2 Enter password: 3 Connected. 4 SQL> select PRIVILEGE from user_sys_privs; 5 no rows selected 6 SQL> conn / as sysDBA 7 Connected. 8 SQL> grant resource to desk; 9 Grant succeeded. 10 SQL> conn desk 11 Enter password: 12 Connected. 13 SQL> select PRIVILEGE from user_sys_privs; 14 PRIVILEGE 15 ---------------------------------------- 16 UNLIMITED TABLESPACE 17 SQL> 18 當把 resource 授予一個 role 時,就不會授予 unlimited tablespace 權限 19 SQL> show user 20 USER is "SYS" 21 SQL> create role testrole identified using testrole; 22 Role created. 23 SQL> revoke resource from desk; 24 Revoke succeeded. 25 SQL> grant resource to testrole; 26 Grant succeeded. 27 SQL> grant testrole to desk; 28 Grant succeeded. 29 SQL> conn desk 30 Enter password: 31 Connected. 32 SQL> select privilege from user_sys_privs; 33 no rows selected 34 SQL>
3)DBA 角色DBA 是在建立數據庫時 Oracle 執行腳本 SQL.BSQ 自動建立的角色,該角色具有所有 系統權限以及 WITH ADMIN OPTION 選項。
要注意的是,CONNECT、RESOURCE、DBA 三種角色是為與先前版本兼容而保留的, 在将來版本中可能不會自動建立。
4)EXP_FULL_DATABASE 角色EXP_FULL_DATABASE 角色是在安裝數據字典時執行 CATEXP.SQL 腳本建立的角色,
該角色用于執行數據庫的完全導出和增量導出操作,并且它包含以下一些權限和角色:
系統權限 SELECT ANY TABLE、BACKUP ANY TABLE、EXECUTE ANY PROCEDURE、
EXECUTE ANY TYPE、ADMINISTER RESOURCE MANAGER,在表 SYS.INCVID、SYS.
INCFIL 以 及 SYS . INCEXP 上 的 INSERT 、 DELETE 和 UPDATE 對 象 權 限 , 以 及
EXECUTE_CATALOG_ROLE 和 SELECT_CATALOG_ROLE 角色。
5)IMP_FULL_DATABASE 角色IMP_FULL_DATABASE 角色也是在安裝數據字典時執行 CATEXP.SQL 腳本建立的角
色,該角色用于執行完全數據庫導人操作,它包含了 EXECUTE CATALOG ROLE 和
SELECT_CATALOG_ROLE 角色以及大量系統權限(查詢 DBA_ SYS_ PRIVS)。
6)DELETE_CATALOG_ROLE 角色DELETE_CATALOG_ROLE 是在建立數據庫時 Oracle 執行 SQL.BSQ 自動建立的角色,該角色提供了在系統審計表 SYS.AUD$上的 DELETE 對象權限。
7)EXECUTE_CATALOG_ROLE 角色EXECUTE_CATALOG_ROLE 是在建立數據庫時 Oracle 執行 SQL.BSQ 自動建立的角
色,該角色提供了對所有系統 PL/SQL 包的 EXECUTE 對象權限。
8)SELECT_CATALOG_ROLE 角色SELECT_CATALOG_ROLE 是在建立數據庫時 Oracle 執行 SQLBSQ 自動建立的角色,
該角色提供了在所有數據字典上的 SELECT 對象權限。
3.2 創建和使用角色 3.2.1 創建角色盡管在設計應用時可以直接使用預定義角色,但出于安全考慮,Oracle,建議使用自定
義角色。建立角色是使用命令 CREATE ROLE,由 DBA 來完成的,但如果要以其他用戶身
份建立角色,那麼要求該用戶必須具有 CREATE ROLE 系統權限。
1.建立角色:不驗證采用不驗證方式建立的角色,隻是在數據字典中存放角色名稱的信息,并且在使角色生
效時不需要進行任何檢查。
【實例 1-1】創建不需要驗證的角色 oe_clerk。
1)以管理員身份登錄 SOL>CONNECT / AS SYSDBA 已連接。 2)創建角色 SOL>CREATE ROLE oe_clerk; 角色已創建
與用戶類似,角色也可以進行驗證,以确保角色的安全性。
2.建立角色:數據庫驗證數據庫驗證是指使用數據庫檢查角色及其口令的方式。當采用這種方式時,角色名及口
令是存放在數據庫中的。當使角色生效時,必須提供口令。
【實例1-2】創建數據庫驗證的角色 hr_clerk。
1)以管理員身份登錄 SOL>CONNECT / AS SYSDBA已連接。 2)創建角色 SOL>CREATE ROLE hr_clerk IDENTIFIED BY bonus; 角色已創建
3.建立角色:外部驗證外部驗證是指使用操作系統服務或網絡服務檢查角色的方式。
【實例 1-3】創建外部驗證的角色 hr_manager。
1)以管理員身份登錄 SOL>CONNECT / AS SYSDBA 已連接。 2)創建角色 SOL>CREATE ROLE hr_manager IDENTIFIED EXTERNALLY; 角色已創建
4.建立應用角色通過使用應用角色可以避免激活角色,采用這種方式建立角色之後,使角色生效是由認
證包來完成的。
【實例 1-4】創建應用角色 admin_role。
1)以管理員身份登錄 SOL>CONNECT / AS SYSDBA 已連接。 2)創建角色 SOL>CREATE ROLE admin_role IDENTIFIED USING hr.pcrt; 角色已創建
其中 USING 子句用于指定認證包。當建立了應用角色 admin_role 之後,該角色可以由
HR 用戶的 pcrt 包中的任何過程或函數激活。
角色創建後,角色沒有任何權限。為了使得角色分配給用戶後,用戶具有相應權限,就
必須為角色授予系統權限或對象權限。給角色授權與給用戶授權的方法完全相同。
【實例1-5】給角色授系統權限。
1)以管理員身份登錄 SOL>CONNECT / AS SYSDBA 已連接。 2)角色授權 SOL>GRANT CREATE SESSION,CREATE TABLE,CREATE VIEW TO oe_clerk WITH ADMIN OPTION; 授權成功。
這樣,當用戶具有角色 oe_clerk 時,該用戶就可以連接到數據庫,并能創建表。另外,
因為在授予這些系統權限時帶有 WITH ADMIN OPTION 選項,所以具有該角色的用戶還可
以将這些系統權限授予其他用戶或角色。
注意,UNLIMITED TABLESPACE 系統權限不能被授予角色;當将對象權限授予角色
時,不能帶有 WITH GRANT OPTION。
3.2.2 用控制台創建角色用控台創建角色的步驟如下:
3.2.3 分配角色
分配角色是指将角色分配給某用戶。在建立了角色并為其授予了權限之後,必須将該角
色分配給用戶,它才能起作用。分配角色與授予系統權限的命令完全相同。當将角色分配給
用戶時,用戶将具有角色的所有系統權限和對象權限。一般情況下,分配角色是由 DBA 來
完成的,如果要以其他用戶身份分配角色,則要求該用戶必須具有 GRANT ANY ROLE 系
統權限或角色的 WITH ADMIN OPTION 選項。
【實例 1-6】把角色 oe_clerk 分配給用戶 devp。
1)以管理員身份登錄 SOL>CONNECT / AS SYSDBA 已連接。 2)分配角色 SOL>GRANT oe_clerk TO devp ; 授權成功。 2)創建表 SQL>connect devp/development 已連接。 SQL>CREATE TABLE tt(a int); 表已創建。
把角色分配給 devp 用戶後,用戶 devp 就具有角色的所有權限了。
【實例 1-7】把角色 hr_manager 分配給用戶 devp。
1)以管理員身份登錄 SOL>CONNECT / AS SYSDBA 已連接。 2)分配角色 SOL>GRANT hr_manager TO devp WITH ADMIN OPTION; 授權成功。
這裡,在分配角色時使用了 WITH ADMIN OPTION 選項,這樣該用戶将具有如下權利:
因此,在為用戶分配角色時應當謹慎使用 WITH ADMIN OPTION 選項,因為該用戶将對角色具有完全控制能力。
3.2.4 用控制台分配角色以下是使用控制台分配角色的步驟:
3.2.5 默認角色
默認角色是用戶所具有的角色的子集,當為用戶指定了默認角色後,以該用戶身份登錄
時會自動激活其默認角色,即用戶具有了角色的權限。當我們為用戶分配了角色之後,隻要
沒有用 ALTER USER …DEFAULT ROLE 作過修改,那麼這些角色都是用戶的默認角色。但
有時要把某些角色設為默認角色,有些角色不是默認角色,就要用命令顯式設定。設置默認
角色一般是由 DBA 來完成的,如果要以其他用戶身份設置用戶的默認角色,則要求該用戶
必須具有 ALTER USER 系統權限。
1.把用戶的所有角色都設為默認角色使用 ALTER USER 命令可以把一個用戶的所有角色都設置為默認角色,這樣,當以該
用戶身份登錄之後,系統會自動激活該用戶的所有角色,用戶就具有了角色的所有權限。
【實例 1-8】把用戶 devp 的所有角色都設置為默認角色,并查看該用戶當前激活的角色。
1)以管理員身份登錄 SOL>CONNECT / AS SYSDBA 已連接。 2)設置默認角色 SOL>ALTER USER devp DEFAULT ROLE ALL; 用戶已更改。 3)以 devp 帳戶登錄 SOL>connect devp/development 已連接。 4)查看 devp 用戶當前激活的角色 SOL>SELECT * FROM session_roles; ROLE ------------ HR_CLERK OE_CLERK
2.指定除某些角色外其他角色都為默認角色在為用戶分配了多個角色之後,可以明确指明多數角色為默認角色,使少數幾個角色成
為非默認角色。
【實例 1-9】指定除某些角色外其他角色都為默認角色,并驗證。
1)以管理員身份登錄 SOL>CONNECT / AS SYSDBA 已連接。 2)設置默認角色 SOL>ALTER USER devp DEFAULT ROLE ALL EXCEPT hr_manager; 用戶已更改。 3)以 devp 帳戶登錄 SQL>connect devp/development 已連接。 4)驗證 devp 權限 SQL>delete from scott.salgrade where grade=1; ERROR 位于第 1 行: ORA-00942: 表或視圖不存在
因為未将 hr_manager 角色設置為 devp 用戶的默認角色,所以以 devp 用戶身份登錄後 不會激活 hr_manager 角色。此時該用戶将不能執行 hr_manager 角色所具有的權限操作。
3.指定某些角色為用戶的默認角色在為用戶分配了多個角色之後,如果隻是要将少數角色設置為默認角色,那麼可以使用
如下方法。
【實例 1-10】把用戶 devp 的某些角色設置為默認角色
1)以管理員身份登錄 SOL>CONNECT / AS SYSDBA 已連接。 2)設置默認角色 SOL>ALTER USER devp DEFAULT ROLE oe_clerk; 用戶已更改。 SQL>connect devp/development 已連接。 3)驗證角色 SOL>SELECT * FROM session_roles; ROLE ------------ OE_CLERK SQL>delete from scott.salgrade where grade=1; ERROR 位于第 1 行: ORA-00942: 表或視圖不存在
因為用戶 devp 的默認角色被設置為 oe_clerk,所以,以 devp 用戶身份登錄後隻會激活角色 oe_clerk,并且隻能執行這種角色所允許的權限操作。
4.指定無默認角色在建立了用戶之後,可以指定用戶無任何默認角色。方法如下:
SOL>connect / AS SYSDBA 已連接。 SOL>ALTER USER alex DEFAULT ROLE NONE; 用戶已更改。
因為沒有給 Alex 用戶設置默認角色,所以以 Alex 用戶身份登錄之後不會激活任何角色,從而使得該用戶不能執行任何角色所具有的權限操作。
寫在最後的話
感謝各位的支持與閱讀,後續會繼續推送相關知識和交流,歡迎交流、轉發和關注,感謝
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!