介紹sql
這一部分主要看看oracle中如何管理權限和角色,權限和角色的區別在哪裏。數據庫
當剛剛創建用戶時,用戶沒有任何權限,也不能執行任何操做。若是要執行某種特定的數據庫操做,則必需爲其授予系統的權限;若是用戶要訪問其它方案的對象,則必需爲其授予對象的權限,爲了簡化權限的管理,可使用角色。安全
權限:session
權限是指執行特定類型sql命令或是訪問其它方案對象的權利,包括系統權限和對角權限兩種。oracle
系統權限介紹ide
系統權限是指執行特定類型sql命令的權利,它用於控制用戶能夠執行的一個或是一組數據庫操做。好比當用戶具備create table權限時,能夠在其方案中建表,當用戶具備create any table權限時,能夠在任何方案中建表。oracle提供了160多中系統權限。經常使用的有:函數
create session 鏈接數據庫;工具
create view 建視圖;測試
create procedure 建過程、函數、包;spa
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選項,這樣,被授予權限的用戶或是角色還能夠將該系統權限授予其它的用戶或是角色。爲了讓你們快速入門,咱們舉例說明:
一、建立兩個用戶ken,tom初始階段他們沒有任何權限,若是登錄就會出錯誤的信息。
1.一、建立兩個用戶,並指定密碼。
SQL>create user ken identified by ken;
SQL>create user tom identified by tom;
二、給用戶ken受權
2.一、授予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.二、授予create view時不帶with admin option
SQL>grant create view to ken;
三、給用戶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]選項只能授予用戶,不能授予角色。
咱們看幾個案例:
一、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;
二、受權alter權限
若是black用戶修改scott.emp表的結構,則必需授予alter對象權限
SQL>grant alter on scott.emp to black;
三、授予execute權限
若是用戶想要執行其它方案的包/過程/函數,則需有execute權限。好比爲了讓ken能夠執行包dbms_transaction,能夠授予execute權限。
SQL>grant execute on dbms_transaction to ken;
四、授予index權限
若是想在別的方案的表上創建索引,則必需具備index對象權限,如爲了讓black能夠在scott.emp上創建索引,就給其index的對象權限
SQL>grant index on scott.emp to blake;
五、使用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 用戶名[,角色名];
特別說明:對象的權限回收是級聯回收。
一、切換system用戶
SQL>conn system/orcl;
二、創建blake和jones用戶
SQL>create user blake identified by blake;
SQL>create user jones identified by jones;
三、給blake和jones用戶賦系統權限(登陸權限)
SQL>grant create session to blake with admin option;
SQL>grant create session to jones;
四、切換scott用戶給blake賦對象權限(查看權限)
SQL>conn scott/tiger;
SQL>grant select on emp to blake with grant option;
五、切換blake用戶給jones賦對象權限(查看權限)
SQL>conn blake/blake;
SQL>grant select on scott.emp to jones;
六、切換scott用戶回收blake對象權限
SQL>conn scott/tiger;
SQL>revoke select on emp from blake;
七、切換blake用戶測試查看對象權限是否還能用。
SQL>conn blake/blake;
SQL>select * from scott.emp;//報錯,blake無查詢權限。
八、切換jones用戶測試查看對象權限是否還能用。
SQL>conn jones/jones;
SQL>select * from scott.emp;//報錯,jones無查詢權限。
管理權限和角色--角色
介紹
角色就是相關權限的命令集合,使用角色的主要目的就是爲了簡化權限的管理。
請看一個問題:假定有用戶1,2,3爲了讓他們都擁有權限。
一、鏈接數據庫
二、在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 用戶名;
一、connect角色
connect角色具備通常應用開發人員須要的大部分權限,只要給用戶授予connect和resource角色就夠了,connect角色具備哪些系統權限呢?
connect角色具備:
create session 建立鏈接權限
二、resource角色
resource角色具備應用開發人員所須要的其它權限,好比創建存儲過程、觸發器等。這裏須要注意的是resource角色隱含了unlimited tablespace系統權限。
resource角色具備:
create trigger 建立觸發器
create sequence 建立序列
create type 建立類型權限
create procedure建立過程
create cluster 建立集羣
create operator 建立運營商
create indextype建立索引類型
create table 建立表
三、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的系統權限。在創建角色時能夠指定驗證方式(不驗證,數據庫驗證等)
一、創建角色(不驗證)
若是角色是公用的角色,能夠採用不驗證的方式創建角色。
創建角色不驗證基本語法:
create role 角色名 not identified;
二、創建角色(數據庫驗證)
採用這樣的方式時,角色名、口令存放在數據庫中。當激活該角色時,必需提供口令。在創建這種角色時,須要爲其提供口令。
創建角色需數據庫驗證基本語法:
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用戶。
一、使用system用戶建立自定義角色
SQL>conn system/orcl;
SQL>create role crud_scott not identified;
二、給自定義角色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;
三、經過將受權過的角色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 角色名;
顯示角色信息
一、顯示全部角色
select * from dba_roles;
二、顯示角色具備的系統權限
select privilege,admin_option from role_sys_privs where role='角色名';
三、顯示角色具備的對象權限
經過查詢數據字典視圖dba_tab_privs能夠查看角色具備的對象權限或是列的權限。
select * from dba_tab_privs where grantee='角色名';
四、顯示用戶具備的角色,及默認角色
當以用戶的身份鏈接到數據庫時,oracle會自動的激活默認的角色,經過查詢數據庫字典視圖dba_role_privs能夠顯示某個用戶具備的全部角色及當前默認的角色
select granted_role,default_role from dba_role_privs where grantee='角色名';
精細訪問控制(只作瞭解,不詳細介紹)
是指用戶可使用函數、策略實現更加細微的案例訪問控制。若是使用精細訪問控制,則當在客戶端發出sql語句(select,insert,update,delete)時,oracle會自動在sql語句後追加謂語(where子句),並執行新的sql語句。經過這樣的控制,可使得不一樣的數據庫用戶在訪問相同的表時,返回不一樣的數據信息。使用函數或策略是爲了更好的保護數據安全性,爲不一樣權限的用戶提供不一樣的安全級別,可有效的保障信息安全。