1 介紹 sql
這一部分咱們主要看看oracle是如何管理權限和角色的,權限和角色的區別在哪裏。 當剛剛創建用戶時,用戶沒有任何權限,也不能執行任何操做。若是要執行某種特定的數據庫操做,則必須爲其授予系統的權限;若是用戶要訪問其它方案的對象,則必須爲其授予對象的權限。爲了簡化權限的管理,可使用角色。這裏咱們會詳細的介紹。看圖:數據庫
2 權限安全
權限是指執行特定類型sql命令或是訪問其它方案對象的權利,包括系統權限和對象權限兩種。session
2.1 系統權限oracle
1)系統權限介紹 ide
系統權限是指執行特定類型sql命令的權利。它用於控制用戶能夠執行的一個或是一組數據庫操做。好比當用戶具備create table權限時,能夠在其方案中建表,當用戶具備create any table權限時,能夠在任何方案中建表。oracle提供了100多種系統權限。函數
經常使用的有: spa
create session 鏈接數據庫 create table 建表 .net
create view 建視圖 create public synonym 建同義詞 code
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