我們經常談及Oracle的權限比如ConnectDBAresource sysdba select any table select_catelog_role這樣一些權限讓我們眼花缭亂的那麼如何來區分這些種類繁多的privilege中不至於眼迷離呢這個文章將會對你在這方面的了解起到幫助
以上我們看到的這些權限都是可以通過grant語句來進行權限賦予同時也可以用過revoke來進行權限收回的操作的但是他們雖然都在grant裡出現但是有各自有著本質的不同
oracle裡的權限有兩種權限系統權限和對象權限所謂系統權限就是oracle裡已經hardcode寫死的權限這些權限我們是不能自己去擴展的比如上面提到的select any table create any table create table等這裡的權限已經在oracle裡全部規定好了
我們可以通過查看system_privilege_map這個數據字典表來查看所以的oracle系統內置的權限
SQL> select * from system_privilege_map;
PRIVILEGE NAME PROPERTY
ALTER SYSTEM
AUDIT SYSTEM
CREATE SESSION
ALTER SESSION
RESTRICTED SESSION
這裡就是所有的內置的系統權限了其實如果有開發過權限系統的經驗的話對這裡的這個概念可以理解為function permission也就是你可以進行哪些操作
這裡特別提到一個另外的知識點有網游朋友問過我create any table和create table有什麼區別create table只能老老實實的給自己的scheam創建表而不能以create table otherschematablename這樣的方式給其他的schema創建表額外提到這點有很多朋友這塊還是模糊的
oracle通過數據字典表dba_sys_privs這個表來記錄user被賦予的系統權限比如
我們現在執行
SQL>grant select any table to test; 把select any table的權限賦予test這個用戶
Grant succeeded
SQL> select * from dba_sys_privs where grantee = TEST;
GRANTEE PRIVILEGE ADMIN_OPTION
TEST SELECT ANY TABLE NO
這裡就可以查詢到這個記錄了 admin_option表示的是是否有把當前這個系統權限grant給其他用戶的意思yes 表示test除了自己有這個權限還可以把這個權限賦予其他用戶N就是沒有grant的權限了
我們可以用一下語句試試
SQL> grant select any table to test with admin option;
Grant succeeded
在來看看剛才的記錄
GRANTEE PRIVILEGE ADMIN_OPTION
TEST SELECT ANY TABLE YES
現在test就可以賦予select any table給別的用戶了
下面我們看看object permission其實這裡已經名字就可以區分開了這裡是針對於特定的對象的權限上面的系統權限是限定了可以操作的功能而object permission就更細化了具體到了莫個對象你可以操作的功能的權限
比如 A用戶建立了一個TableA表現在為了讓B用戶可以看到A這個對象我們就可以把Atable的select權限 進行賦予這裡的Atable上的select權限就是一個對象權限
除了select還有updatedeleteinsertalterdropindexreferences這樣正對於對象的權限
除了可以給表對象指定對象權限外viewsequenceprocedurefunctionpackagetrigggerMV等這些oracle裡的對象都可以進行對象的權限指定
對於對象權限來說由於對象權限完全是動態的在對一個對象進行grant的時候才能看到具體的對象權限所以對象權限是不像system privilege那樣有一個表來描述的只有一個表來記錄用戶和這個用戶對於的對象權限的關系表這個表就是dba_tab_privs;
這裡這個名字比較容易讓人誤會為只有table的對象權限其實不然這裡其他類型的對象的對象權限也會記錄進來
實驗一下還是剛才的test用戶我現在把對象dbms_xplan的execute的權限給他dbms_xplan這個有些朋友可能不熟悉這是執行計劃有關的一個對象朋友們如果沒有安裝執行計劃的包可以用dbms_output對象做實驗
SQL>grant execute on dbms_xplan to test;
SQL>grant execute on dbms_output to test;
SQL> select * from dba_tab_privs where grantee = TEST;
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
TEST SYS DBMS_XPLAN SYS EXECUTE NO NO
TEST SYS DBMS_OUTPUT SYS EXECUTE
這裡注意和fuanction 不同的這裡有一個GRANTABLE的字段意味和上面admin option一樣的作用
不過這裡的sql不同了
SQL>grant execute on dbms_xplan to test with grant option;
這裡是oracle裡的權限了
不過有的人可能會問道咦你是不是漏掉了不是我們還可以
grant connect resource dba to username;嗎那她們都是什麼權限呀
在這裡就要注意了這裡的connct resource dba都不是權限而是一個role角色一個角色是個或者多個系統權限或者對象權限的集合 是便於我們管理用戶賦權而演化而來的這裡的create role和賦予role權限我們就不詳談了朋友們可以自己查一查相關資料role是我們可以動態建立的建立的role可以用grant來賦予權限或者把一個role賦予另一個role
我們可以通過dba_roles這個表來查詢系統裡所有的role
SQL> select * from dba_roles;
ROLE PASSWORD_REQUIRED
CONNECT NO
RESOURCE NO
DBA NO
SELECT_CATALOG_ROLE NO
EXECUTE_CATALOG_ROLE NO
DELETE_CATALOG_ROLE NO
我們可以把role的賦予一個用戶
比如
SQL>grant select_catalog_role to test;
我們可以通過dba_role_privs來查詢相關用戶的role的賦予比如
SQL> select * from dba_role_privs where grantee = TEST;
GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
From:http://tw.wingwit.com/Article/program/Oracle/201311/16827.html