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