熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

關於ORACLE的權限賦予問題

2013-11-13 15:30:23  來源: Oracle 

  我們經常談及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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.