oracle的權限和角色


1 介紹 

  這一部分我們主要看看oracle是如何管理權限和角色的,權限和角色的區別在哪里。 當剛剛建立用戶時,用戶沒有任何權限,也不能執行任何操作。如果要執行某種特定的數據庫操作,則必須為其授予系統的權限;如果用戶要訪問其它方案的對象,則必須為其授予對象的權限。為了簡化權限的管理,可以使用角色。這里我們會詳細的介紹。看圖:

2 權限

  權限是指執行特定類型sql命令或是訪問其它方案對象的權利,包括系統權限和對象權限兩種。

  2.1 系統權限

  1)系統權限介紹 

  系統權限是指執行特定類型sql命令的權利。它用於控制用戶可以執行的一個或是一組數據庫操作。比如當用戶具有create table權限時,可以在其方案中建表,當用戶具有create any table權限時,可以在任何方案中建表。oracle提供了100多種系統權限。

  常用的有: 

    create session    連接數據庫             create table                  建表 

    create view          建視圖                 create public synonym   建同義詞 

    create procedure 建過程、函數、包    create trigger                建觸發器 

    create cluster      建簇 

  2)顯示系統權限 

  oracle提供了100多種系統權限,而且oracle的版本越高,提供的系統權限就越多,我們可以查詢數據字典視圖system_privilege_map,可以顯示所有系統權限,sql語句為:

select * from system_privilege_map order by name; 

  3)授予系統權限 

  一般情況,授予系統權限是由dba完成的,如果用其他用戶來授予系統權限,則要求該用戶必須具有grant any privilege的系統權限。在授予系統權限時,可以帶有with admin option選項,這樣,被授予權限的用戶或是角色還可以將該系統權限授予其它的用戶或是角色。為了讓大家快速理解,我們舉例說明: 

  1 創建兩個用戶ken,tom。初始階段他們沒有任何權限,如果登錄就會給出錯誤的信息。 

create user ken identfied by ken; 

  2 給用戶ken授權 

  (1)grant create session, create table to ken with admin option; 

  (2)grant create view to ken; 

  3 給用戶tom授權

  我們可以通過ken給tom授權,因為with admin option是加上的。當然也可以通過dba給tom授權,我們就用ken給tom授權: 

  (1)grant create session, create table to tom; 

  (2)grant create view to ken;  --這樣可以嗎?不可以。 

  4)回收系統權限 

  一般情況下,回收系統權限是dba來完成的,如果其它的用戶來回收系統權限,要求該用戶必須具有相應系統權限及轉授系統權限的選項(with admin option)。回收系統權限使用revoke來完成。

  當回收了系統權限后,用戶就不能執行相應的操作了,但是請注意,系統權限級聯收回的問題?[不是級聯回收!] 

  system --------->ken ---------->tom 

  (create session)(create session)( create session) 

  用system執行如下操作:

  revoke create session from ken;  --請思考tom還能登錄嗎? 

  答案:能,可以登錄 

  2.2 對象權限 

  1)對象權限介紹 

  對象權限指訪問其它方案對象的權利,用戶可以直接訪問自己方案的對象,但是如果要訪問別的方案的對象,則必須具有對象的權限。

  比如smith用戶要訪問scott.emp表(scott:方案,emp:表) 

  常用的有:

    alter    修改  delete 刪除    select      查詢     insert   添加 

    update   修改  index  索引    references  引用     execute  執行 

  2)顯示對象權限 

  通過數據字段視圖可以顯示用戶或是角色所具有的對象權限。視圖為dba_tab_privs 

SQL> conn system/manager;
SQL> select distinct privilege from dba_tab_privs; 
SQL> select grantor, owner, table_name, privilege from dba_tab_privs where grantee = 'BLAKE'; 

  (1)授予對象權限 

  在oracle9i以前,授予對象權限是由對象的所有者來完成的,如果用其它的用戶來操作,則需要用戶具有相應的(with grant option)權限,從oracle9i開始,dba用戶(sys,system)可以將任何對象上的對象權限授予其它用戶。授予對象權限是用grant命令來完成的。

  對象權限可以授予用戶,角色,和public。在授予權限時,如果帶有with grant option選項,則可以將該權限轉授給其它用戶。但要注意with grant option選項不能被授予角色。 

  ① monkey用戶要操作scott.emp表,則必須授予相應的對象權限 

  1) 希望monkey可以查詢scott.emp表的數據,怎樣操作? 

grant select on emp to monkey; 

  2) 希望monkey可以修改scott.emp的表數據,怎樣操作? 

grant update on emp to monkey; 

  3) 希望monkey可以刪除scott.emp的表數據,怎樣操作?

grant delete on emp to monkey; 

  4) 有沒有更加簡單的方法,一次把所有權限賦給monkey?

grant all on emp to monkey;

  ② 能否對monkey訪問權限更加精細控制。(授予列權限) 

  1)希望monkey只可以修改scott.emp的表的sal字段,怎樣操作? 

grant update on emp(sal) to monkey 

  2)希望monkey只可以查詢scott.emp的表的ename,sal數據,怎樣操作? 

grant select on emp(ename,sal) to monkey 

  ③ 授予alter權限 

  如果black用戶要修改scott.emp表的結構,則必須授予alter對象權限 

SQL> conn scott/tiger
SQL> grant alter on emp to blake; 

  當然也可以用system,sys來完成這件事。 

  ④ 授予execute權限 

  如果用戶想要執行其它方案的包/過程/函數,則須有execute權限。 

  比如為了讓ken可以執行包dbms_transaction,可以授予execute權限。 

SQL> conn system/manager 
SQL> grant execute on dbms_transaction to ken; 

  ⑤ 授予index權限

  如果想在別的方案的表上建立索引,則必須具有index對象權限。 

  如果為了讓black可以在scott.emp表上建立索引,就給其index的對象權限 

SQL> conn scott/tiger 
SQL> grant index on scott.emp to blake; 

  ⑥ 使用with grant option選項 

  該選項用於轉授對象權限。但是該選項只能被授予用戶,而不能授予角色 。

SQL> conn scott/tiger; 
SQL> grant select on emp to blake with grant option; 
SQL> conn black/shunping 
SQL> grant select on scott.emp to jones; 

  3)回收對象權限 

  在oracle9i中,收回對象的權限可以由對象的所有者來完成,也可以用dba用戶(sys,system)來完成。 

  這里要說明的是:收回對象權限后,用戶就不能執行相應的sql命令,但是要注意的是對象的權限是否會被級聯收回?【級聯回收】 

  如:scott------------->blake-------------->jones 

  select on emp     select on emp       select on emp 

SQL> conn scott/tiger@accp 
SQL> revoke select on emp from blake 

  請大家思考,jones能否查詢scott.emp表數據?

  答案:查不了了(和系統權限不一樣,剛好相反)。

3 角色

  角色就是相關權限的命令集合,使用角色的主要目的就是為了簡化權限的管理,假定有用戶a,b,c為了讓他們都擁有權限:連接數據庫和在scott.emp表上select,insert,update。 如果采用直接授權操作,則需要進行12次授權。 因為要進行12次授權操作,所以比較麻煩!怎么辦呢? 如果我們采用角色就可以簡化: 首先將creat session,select on scott.emp,insert on scott.emp,update on scott.emp授予角色,然后將該角色授予a,b,c用戶,這樣就可以三次授權搞定。 角色分為預定義和自定義角色兩類。   

  3.1 預定義角色

  預定義角色是指oracle所提供的角色,每種角色都用於執行一些特定的管理任務,下面我們介紹常用的預定義角色connect,resource,dba 。角色所包含的權限可以用以下語句查詢:

select * from role_sys_privs where role='角色名';

  1)connect角色 

  connect角色具有一般應用開發人員需要的大部分權限,當建立了一個用戶后,多數情況下,只要給用戶授予connect和resource角色就夠了,那么connect角色具有哪些系統權限呢? 

SQL> select * from role_sys_privs where role='CONNECT';
 
ROLE                           PRIVILEGE                                ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
CONNECT                        CREATE SESSION                           NO

  2)resource角色 

  resource角色具有應用開發人員所需要的其它權限,比如建立存儲過程,觸發器等。這里需要注意的是resource角色隱含了unlimited tablespace系統權限。 

SQL> select * from role_sys_privs where role='RESOURCE';
 
ROLE                           PRIVILEGE                                ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
RESOURCE                       CREATE SEQUENCE                          NO
RESOURCE                       CREATE TRIGGER                           NO
RESOURCE                       CREATE CLUSTER                           NO
RESOURCE                       CREATE PROCEDURE                         NO
RESOURCE                       CREATE TYPE                              NO
RESOURCE                       CREATE OPERATOR                          NO
RESOURCE                       CREATE TABLE                             NO
RESOURCE                       CREATE INDEXTYPE                         NO
 
8 rows selected

  3)dba角色 

  dba角色具有所有的系統權限,及with admin option選項,默認的dba用戶為sys和system,它們可以將任何系統權限授予其他用戶。但是要注意的是dba角色不具備sysdba和sysoper的特權(啟動和關閉數據庫)。 

  3.2 自定義角色 

  顧名思義就是自己定義的角色,根據自己的需要來定義。一般是dba來建立,如果用別的用戶來建立,則需要具有create role的系統權限。在建立角色時可以指定驗證方式(不驗證,數據庫驗證等)。 

  1)建立角色(不驗證) 

  如果角色是公用的角色,可以采用不驗證的方式建立角色。 

create role 角色名 not identified; 

  2)建立角色(數據庫驗證) 

  采用這樣的方式時,角色名、口令存放在數據庫中。當激活該角色時,必須提供口令。在建立這種角色時,需要為其提供口令。 

create role 角色名 identified by 密碼; 

4 角色授權 

  當建立角色時,角色沒有任何權限,為了使得角色完成特定任務,必須為其授予相應的系統權限和對象權限。 

  4.1 給角色授權

  給角色授予權限和給用戶授權沒有太多區別,但是要注意,系統權限的unlimited tablespace和對象權限的with grant option選項是不能授予角色的。 

SQL> conn system/manager; 
SQL> grant create session to 角色名 with admin option 
SQL> conn scott/tiger@myoral; 
SQL> grant select on scott.emp to 角色名; 
SQL> grant insert, update, delete on scott.emp to 角色名; 

  通過上面的步驟,就給角色授權了。 

  4.2 分配角色給某個用戶 

  一般分配角色是由dba來完成的,如果要以其它用戶身份分配角色,則要求用戶必須具有grant any role的系統權限。 

SQL> conn system/manager; 
SQL> grant 角色名 to blake with admin option; 

  因為我給了with admin option選項,所以,blake可以把system分配給它的角色分配給別的用戶。 

  4.3 刪除角色 

  使用drop role,一般是dba來執行,如果其它用戶則要求該用戶具有drop any role系統權限。 

SQL> conn system/manager; 
SQL> drop role 角色名; 

  問題:如果角色被刪除,那么被授予角色的用戶是否還具有之前角色里的權限? 

  答案:不具有了 

  4.4 顯示角色信息 

  1)顯示所有角色 

SQL> select * from dba_roles;

  2)顯示角色具有的系統權限 

SQL> select privilege, admin_option from role_sys_privs where role='角色名'; 

  3)顯示角色具有的對象權限 

  通過查詢數據字典視圖dba_tab_privs可以查看角色具有的對象權限或是列的權限。 

  4)顯示用戶具有的角色,及默認角色 

  當以用戶的身份連接到數據庫時,oracle會自動的激活默認的角色,通過查詢數據字典視圖dba_role_privs可以顯示某個用戶具有的所有角色及當前默認的角色 

SQL> select granted_role, default_role from dba_role_privs where grantee = '用戶名'; 

  4.5 精細訪問控制

  精細訪問控制是指用戶可以使用函數、策略實現更加細微的安全訪問控制。如果使用精細訪問控制,則當在客戶端發出sql語句(select,insert,update,delete)時,oracle會自動在sql語句后追加謂詞(where子句),並執行新的sql語句,通過這樣的控制,可以使得不同的數據庫用戶在訪問相同表時,返回不同的數據信息。

 

參考資料:

http://blog.csdn.net/yjsuge/article/details/6554099

http://blog.csdn.net/junmail/article/details/4381287


免責聲明!

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



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