許可權是指執行特定類型sql命令或是訪問其它方案對象的權利,包括系統許可權和對象許可權兩種。
1. 系統許可權
系統許可權是指執行特定類型sql命令的權利。它用於控制使用者可以執行的一個或是一組資料庫操作。比如當使用者具有create table許可權時,可以在其方案中建表,當使用者具有create any table許可權時,可以在任何方案中建表。oracle提供了100多種系統許可權。
常用的包括如下:
create session -- 串連資料
create table -- 建表
create view -- 建視圖
create public synonym -- 建同義字
create procedure -- 建過程、函數、包
create trigger -- 建觸發器
create cluster -- 建簇
(1). 顯示系統許可權
oracle提供了100多種系統許可權,而且oracle的版本越高,提供的系統許可權就越多,可以查詢資料字典視圖system_privilege_map,
可以顯示所有系統許可權。
例:select * from system_privilege_map order by name;
(2). 授予系統許可權
一般情況,授予系統許可權是由dba完成的,如果用其他使用者來授予系統許可權,則要求該使用者必須具有grant any privilege的系統許可權。在授予系統許可權時,可以帶有with admin option選項,這樣,被授予許可權的使用者或是角色還可以將該系統許可權授予其它的使用者或是角色。為了讓大家快速理解,我們舉例說明:
a. 建立兩個使用者ken,tom。初始階段他們沒有任何許可權,如果登入就會給出錯誤的資訊。
例:create user ken identfied by ken;
b. 給使用者ken授權
例:grant create session, create table to ken with admin option;
grant create view to ken;
c. 給使用者tom授權
我們可以通過ken給tom授權,因為with admin option是加上的。當然也可以通過dba給tom授權,我們就用ken給tom授權:
grant create session, create table to tom;
grant create view to ken; --ok嗎?不ok
(3). 回收系統許可權
一般情況下,回收系統許可權是dba來完成的,如果其它的使用者來回收系統許可權,要求該使用者必須具有相應系統許可權及轉授系統許可權的選項(with admin option)。回收系統許可權使用revoke來完成。
當回收了系統許可權後,使用者就不能執行相應的操作了,但是請注意,系統許可權級聯收回的問題?[不是級聯回收!]
system --------->ken ---------->tom
(create session)(create session)( create session)
用system執行如下操作:
revoke create session from ken; --請思考tom還能登入嗎?
答案:能,可以登入
2. 對象許可權
指訪問其它方案對象的權利,使用者可以直接存取自己方案的對象,但是如果要訪問別的方案的對象,則必須具有對象的許可權。比如smith使用者要訪問scott.emp表(scott:方案,emp:表)。
常用的包括如下:
alter -- 修改
delete -- 刪除
select -- 查詢
insert -- 添加
update -- 修改
index -- 索引
references -- 引用
execute -- 執行
(1). 顯示對象許可權
通過資料欄位視圖可以顯示使用者或是角色所具有的對象許可權。視圖為dba_tab_privs
conn system/manager;
select distinct privilege from dba_tab_privs;
select grantor, owner, table_name, privilege from dba_tab_privs where grantee = 'BLAKE';
(2). 授予對象許可權
在oracle9i前,授予對象許可權是由對象的所有者來完成的,如果用其它的使用者來操作,則需要使用者具有相應的(with grant option)許可權,從oracle9i開始,dba使用者(sys,system)可以將任何對象上的對象許可權授予其它使用者。授予對象許可權是用grant命令來完成的。
對象許可權可以授予使用者,角色,和public。在授予許可權時,如果帶有with grant option選項,則可以將該許可權轉授給其它使用者。但是要注意with grant option選項不能被授予角色。
a. 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;
b. 能否對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;
c. 授予alter許可權
如果black使用者要修改scott.emp表的結構,則必須授予alter對象許可權
conn scott/tiger;
grant alter on emp to blake;
當然也可以用system,sys來完成這件事。
d. 授予execute許可權
如果使用者想要執行其它方案的包/過程/函數,則須有execute許可權。
比如為了讓ken可以執行包dbms_transaction,可以授予execute許可權。
conn system/manager;
grant execute on dbms_transaction to ken;
e. 授予index許可權
如果想在別的方案的表上建立索引,則必須具有index對象許可權。
如果為了讓black可以在scott.emp表上建立索引,就給其index的對象許可權
conn scott/tiger;
grant index on scott.emp to blake;
f. 使用with grant option選項
該選項用於轉授對象許可權。但是該選項只能被授予使用者,而不能授予角色
conn scott/tiger;
grant select on emp to blake with grant option;
conn black/shunping
grant select on scott.emp to jones;
g. 回收對象許可權
在oracle9i中,收回對象的許可權可以由對象的所有者來完成,也可以用dba使用者(sys,system)來完成。
這裡要說明的是:收回對象許可權後,使用者就不能執行相應的sql命令,但是要注意的是對象的許可權是否會被級聯收回?[ 級聯回
收 ]
如:scott------------->blake-------------->jones
select on emp select on emp select on emp
conn scott/tiger@accp
revoke select on emp from blake
請大家思考,jones能否查詢scott.emp表資料。
答案:查不了了(和系統許可權不一樣,剛好相反)。