介紹
這一部分主要看看oracle中如何管理權限和角色,權限和角色的區別在哪里。
當剛剛建立用戶時,用戶沒有任何權限,也不能執行任何操作。如果要執行某種特定的數據庫操作,則必需為其授予系統的權限;如果用戶要訪問其它方案的對象,則必需為其授予對象的權限,為了簡化權限的管理,可以使用角色。
權限:
權限是指執行特定類型sql命令或是訪問其它方案對象的權利,包括系統權限和對角權限兩種。
系統權限介紹
系統權限是指執行特定類型sql命令的權利,它用於控制用戶可以執行的一個或是一組數據庫操作。比如當用戶具有create table權限時,可以在其方案中建表,當用戶具有create any table權限時,可以在任何方案中建表。oracle提供了160多中系統權限。常用的有:
create session 連接數據庫;
create view 建視圖;
create procedure 建過程、函數、包;
create cluster 建簇;
create table 建表;
create public synonym 建同義詞;
create trigger 建觸發器;
顯示系統權限
oracle提供了166系統權限,而且oracle的版本越高,提供的系統權限就越多,我們可以查詢數據字典視圖system_privilege_map,可以顯示所有系統權限。
基本語法:
select * from system_privilege_map order by name;
oracle11GR2中提供了208個系統權限。
授予系統權限
一般情況,授予系統權限是有dba完成的,如果用其它用戶來授予系統權限,則要求用戶必需具有grant any privilege的系統權限在授予系統權限時,可以帶有with admin option選項,這樣,被授予權限的用戶或是角色還可以將該系統權限授予其它的用戶或是角色。為了讓大家快速入門,我們舉例說明:
1、創建兩個用戶ken,tom初始階段他們沒有任何權限,如果登陸就會出錯誤的信息。
1.1、創建兩個用戶,並指定密碼。
SQL>create user ken identified by ken;
SQL>create user tom identified by tom;
2、給用戶ken授權
2.1、授予create session和create table權限時帶with admin option
授權基本語法:
grant 權限名稱 to 用戶名;
SQL>grant create session to ken with admin option;
SQL>grant create table to ken with admin option;
2.2、授予create view時不帶with admin option
SQL>grant create view to ken;
3、給用戶tom授權
我們可以通過ken給tom授權,因為with admin option是加上的。當然也可以通過dba給tom授權,我們就用ken給tom授權:
SQL>grant create session to tom with admin option;
SQL>grant create table to tom with admin option;
SQL>grant create view to tom;//報錯,由於ken被dba授權時沒有帶with admin option參數,所以ken沒有權限對tom進行create view的授權。
回收系統權限
一般情況下,回收系統權限是dba來完成的,如果其它的用戶來回收系統權限,要求該用戶必需具有相應系統權限及轉授系統權限的選項(with admin option)。回收系統權限使用revoke來完成,當回收了系統權限后,用戶就不能執行相應的操作了,但是請注意,系統權限級聯收回問題?(不會級聯回收權限)
system==>>ken==>>tom
(create session)(create session)(create session)
用system執行如下操作:
revoke create session from ken;請思考tom還能登錄嗎?可以登錄。
回收系統權限基本語法:
revoke 系統權限名 from 用戶名;
特別說明:系統權限的回收不是級聯回收。
對象權限介紹
訪問其它方案對象的權利,用戶可以直接訪問自己方案的對象,但是如果要訪問別的方案的對象,則必需具有對象的權限,比如smith用戶要訪問scott.emp表(scott:方案,emp:表)
則必需在scott.emp表上具有對象的權限。常用的權限有:
alter 修改、delete 刪除、select 查詢、insert 添加、update 修改、index 索引、references 引用、execute執行。
查看oracle提供的所有的對象權限(僅dba用戶可以查看)
select distinct privilege from dba_tab_privs;
重要查詢文檔
查看當前用戶的表(自己的表)
select table_name from user_tables;
查詢oracle中所有的系統權限,一般是dba
select * from system_privilege_map order by name;
查詢oracle中所有的角色,一般是dba
select * from dba_roles;
查詢oracle中所有對象權限,一般是dba
select distinct privilege from dba_tab_privs;
查詢數據庫的表空間
select tablespace_name from dba_tablespaces;
查詢當前用戶具有什么樣的系統權限
select * from user_sys_privs;
查詢當前用戶在別人的表上,具有什么樣的對象權限
select * from user_tab_privs; (查看對表的權限)
select * from user_col_privs; (查看對表的列的權限)
查詢某個用戶具有怎樣的角色
select * from dba_role_privs where grantee='用戶名';
查看某個角色包括哪些系統權限。
select * from dba_sys_privs where grantee='DBA';
或者是:
select * from role_sys_privs where role='DBA';
查看某個角色包括的對象權限
select * from dba_tab_privs where grantee='角色名';
當某個角色具有什么樣的系統權限或對象權限,也可通過pl/sql developer工具直接查看即可。
顯示執行的錯誤信息
在執行完語句后,就執行下面的語句
show error;
顯示oracle某個操作用時
set timing on;
授權對象權限
在oracle9i前,授予對象權限是由對象的所有者來完成的,如果用其它的用戶來操作,則需要用戶具有相應的(with grant option)權限,從oracle9i開始,sys,system可以將任何對象上的對象權限授予其它用戶,授予對象權限是用grant命令來完成的。
授權基本語法:
grant 對象權限 on 數據庫對象 to 用戶名 [with grant option] [,角色名]
特別說明:可以把權限直接賦給用戶或角色。[with grant option]選項只能授予用戶,不能授予角色。
我們看幾個案例:
1、monkey用戶要操作scott.emp表,則必需授予相應的對象權限。
(1)、希望monkey可以查詢scott.emp的表數據,怎樣操作?
SQL>grant select on scott.emp to monkey;
(2)、希望monkey可以修改scott.emp的表數據,怎樣操作?
SQL>grant update on scott.emp to monkey;
(3)、希望monkey可以刪除scott.emp的表數據,怎樣操作?
SQL>grant delete on scott.emp to monkey;
(4)、有沒有更加簡單的方法,一次把所有權限賦給monkey?
SQL>grant all on scott.emp to monkey;
2、授權alter權限
如果black用戶修改scott.emp表的結構,則必需授予alter對象權限
SQL>grant alter on scott.emp to black;
3、授予execute權限
如果用戶想要執行其它方案的包/過程/函數,則需有execute權限。比如為了讓ken可以執行包dbms_transaction,可以授予execute權限。
SQL>grant execute on dbms_transaction to ken;
4、授予index權限
如果想在別的方案的表上建立索引,則必需具有index對象權限,如為了讓black可以在scott.emp上建立索引,就給其index的對象權限
SQL>grant index on scott.emp to blake;
5、使用with grant option選項
該選項用於轉授對象權限,但是該選項只能被授予用戶,而不能授予角色。
例:由blake給jones授予select權限
先由dba給blake授予select權限
SQL>conn system/orcl;
SQL>grant select on scott.emp to blake with grant option;
SQL>conn blake/orcl;
SQL>grant select on scott.emp to jones;
回收對象權限
在oracle9i中,收回對象的權限可以由對象的所有者來完成,也可以用dba用戶(sys,system)來完成。
這里要說明的是:收回對象權限后,用戶就不能執行相應的sql命令,但是要注意的是對象的權限是否會被級聯收回?(級聯回收)
請看案例:
scott========>>blake========>>jones
select on emp select on emp select on emp
對象權限回收基本語法:
revoke 對象權限 on 數據庫對象 from 用戶名[,角色名];
特別說明:對象的權限回收是級聯回收。
1、切換system用戶
SQL>conn system/orcl;
2、建立blake和jones用戶
SQL>create user blake identified by blake;
SQL>create user jones identified by jones;
3、給blake和jones用戶賦系統權限(登錄權限)
SQL>grant create session to blake with admin option;
SQL>grant create session to jones;
4、切換scott用戶給blake賦對象權限(查看權限)
SQL>conn scott/tiger;
SQL>grant select on emp to blake with grant option;
5、切換blake用戶給jones賦對象權限(查看權限)
SQL>conn blake/blake;
SQL>grant select on scott.emp to jones;
6、切換scott用戶回收blake對象權限
SQL>conn scott/tiger;
SQL>revoke select on emp from blake;
7、切換blake用戶測試查看對象權限是否還能用。
SQL>conn blake/blake;
SQL>select * from scott.emp;//報錯,blake無查詢權限。
8、切換jones用戶測試查看對象權限是否還能用。
SQL>conn jones/jones;
SQL>select * from scott.emp;//報錯,jones無查詢權限。
管理權限和角色--角色
介紹
角色就是相關權限的命令集合,使用角色的主要目的就是為了簡化權限的管理。
請看一個問題:假定有用戶1,2,3為了讓他們都擁有權限。
1、連接數據庫
2、在scott.emp表上select,insert,update
如果采用直接授權操作,則需要進行12次授權。
角色分為預定義角色和自定義角色。
預定義角色
預定義角色是指oracle所提供的角色,每種角色都用於執行一些特定的管理任務,下面我們介紹常用的預定義角色connect,resource,dba
特別說明:角色可以包含系統權限,也可以包含對象權限。
要查看角色有怎樣的權限可以通過下列語句查看:
select * from dba_sys_privs where grantee='DBA';
注意:查詢時角色的名稱要大寫(DBA、CONNECT、RESOURCE),小寫無法查詢
使用system登錄可以查詢所有預定義角色:
select * from dba_roles;
如何知道某個用戶具有什么樣的角色:
select * from dba_role_privs where grantee='用戶名';
通過角色給用戶賦權限基本語法:
grant 角色名[,角色名2,...] to 用戶名;
1、connect角色
connect角色具有一般應用開發人員需要的大部分權限,只要給用戶授予connect和resource角色就夠了,connect角色具有哪些系統權限呢?
connect角色具有:
create session 創建連接權限
2、resource角色
resource角色具有應用開發人員所需要的其它權限,比如建立存儲過程、觸發器等。這里需要注意的是resource角色隱含了unlimited tablespace系統權限。
resource角色具有:
create trigger 創建觸發器
create sequence 創建序列
create type 創建類型權限
create procedure創建過程
create cluster 創建集群
create operator 創建運營商
create indextype創建索引類型
create table 創建表
3、dba角色
dba角色具有所有的系統權限,及with admin option選項,默認的dba用戶為sys和system他們可以將任何系統權限授予其它用戶,但是要注意的是dba角色不具備sysdba和sysoper的特權(啟動和關閉數據庫)
案例:
創建一個用戶,然后賦給connect角色和resource角色
SQL>create user tempuser identified by tempuser;
SQL>grant connect,resource to tempuser;
創建一個用戶jack並將其設為具有dba角色的用戶
SQL>create user jack identified by jack;
SQL>grant dba to jack;
自定義角色
顧名思義就是自己定義的角色,根據自己的需要來定義,一般是dba來建立,如果使用別的用戶來建立,則需要具有create role的系統權限。在建立角色時可以指定驗證方式(不驗證,數據庫驗證等)
1、建立角色(不驗證)
如果角色是公用的角色,可以采用不驗證的方式建立角色。
建立角色不驗證基本語法:
create role 角色名 not identified;
2、建立角色(數據庫驗證)
采用這樣的方式時,角色名、口令存放在數據庫中。當激活該角色時,必需提供口令。在建立這種角色時,需要為其提供口令。
建立角色需數據庫驗證基本語法:
create role 角色名 identified by 口令;
角色授權
當建立角色時,角色沒有任何權限,為了使得角色完成特定任務,必需為其授予相應的系統權限和對象權限。
(一)給角色授權
給角色授予權限和給用戶授權沒有太多區別,但是要注意,系統權限的unlimited tablespace和對象權限的with grant option選項是不能授予角色的。
給角色授權基本語法:
grant 對象權限 on 數據庫對象 to 自定義角色名;
案例:
完成將create session,select on scott.emp,insert on scott.emp,update on scott.emp授予角色,然后將該角色授予a,b,c用戶。
1、使用system用戶創建自定義角色
SQL>conn system/orcl;
SQL>create role crud_scott not identified;
2、給自定義角色crud_scott授權
SQL>grant create session to crud_scott;
SQL>grant select on scott.emp to crud_scott;
SQL>grant insert on scott.emp to crud_scott;
SQL>grant update on scott.emp to crud_scott;
3、通過將授權過的角色crud_scott給用戶進行授權
SQL>grant crud_scott to a;
SQL>grant crud_scott to b;
SQL>grant crud_scott to c;
(二)分配角色給某個用戶
一般分配角色是由DBA來完成的,如果要以其它用戶身份分配角色,則要求用戶必需具有grant any role的系統權限。
通過角色名授權用戶基本語法:
grant 角色名 to 用戶名 [with admin option];
如果給用戶賦權限時帶了with admin option選項,被授權的用戶可以繼續將此權限授予其它用戶。
刪除角色
使用drop role,一般是dba來執行,如用其它用戶則要求該用戶具有drop any role系統權限
刪除角色基本語法:
drop role 角色名;
顯示角色信息
1、顯示所有角色
select * from dba_roles;
2、顯示角色具有的系統權限
select privilege,admin_option from role_sys_privs where role='角色名';
3、顯示角色具有的對象權限
通過查詢數據字典視圖dba_tab_privs可以查看角色具有的對象權限或是列的權限。
select * from dba_tab_privs where grantee='角色名';
4、顯示用戶具有的角色,及默認角色
當以用戶的身份連接到數據庫時,oracle會自動的激活默認的角色,通過查詢數據庫字典視圖dba_role_privs可以顯示某個用戶具有的所有角色及當前默認的角色
select granted_role,default_role from dba_role_privs where grantee='角色名';
精細訪問控制(只做了解,不詳細介紹)
是指用戶可以使用函數、策略實現更加細微的案例訪問控制。如果使用精細訪問控制,則當在客戶端發出sql語句(select,insert,update,delete)時,oracle會自動在sql語句后追加謂語(where子句),並執行新的sql語句。通過這樣的控制,可以使得不同的數據庫用戶在訪問相同的表時,返回不同的數據信息。使用函數或策略是為了更好的保護數據安全性,為不同權限的用戶提供不同的安全級別,可有效的保障信息安全。