现在的位置: 首页 > 综合 > 正文

细谈Oracle的权限

2013年11月20日 ⁄ 综合 ⁄ 共 4851字 ⁄ 字号 评论关闭

我们经常谈及Oracle的权限,比如Connect,DBA,resource, 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

---------- ---------------------------------------- ----------

        -3 ALTER SYSTEM      
                   
           0

        -4 AUDIT SYSTEM      
                   
           0

        -5 CREATE SESSION    
                   
           0

        -6 ALTER SESSION    
                   
            0

        -7 RESTRICTED SESSION    
                   
       0

    
 这里就是所有的内置的系统权限了,其实如果有开发过权限系统的经验的话,对这里的这个概念,可以理解为function
permission,也就是你可以进行哪些操作。

      这里特别提到一个另外的知识点,有网游朋友问过我,create any
table和create table有什么区别,create table只能老老实实的给自己的scheam创建表,而不能以create
table otherschema.tablename这样的方式给其他的schema创建表。额外提到这点,有很多朋友这块还是模糊的。

        
 oracle通过数据字典表dba_sys_privs这个表来记录user被赋予的系统权限,比如

我们现在执行

SQL>grant select any table to test1; -- 把select any
table的权限赋予test1这个用户

Grant succeeded

SQL> select * from dba_sys_privs where grantee = 'TEST1';

GRANTEE                
       PRIVILEGE          
                   
 ADMIN_OPTION

------------------------------
---------------------------------------- ------------

TEST1                  
       SELECT ANY TABLE        
                NO

             这里就可以查询到这个记录了。
admin_option表示的是是否有把当前这个系统权限grant给其他用户的意思。yes
表示test1除了自己有这个权限,还可以把这个权限赋予其他用户。N就是没有grant的权限了。

我们可以用一下语句试试

SQL> grant select any table to test1 with admin option;

Grant succeeded

在来看看刚才的记录

GRANTEE                
       PRIVILEGE          
                   
 ADMIN_OPTION

------------------------------
---------------------------------------- ------------

TEST1                  
       SELECT ANY TABLE        
                YES

    现在test1就可以赋予select any table给别的用户了。

      下面我们看看object
permission,其实这里已经名字就可以区分开了,这里是针对于特定的对象的权限,上面的系统权限是限定了可以操作的功能,而object
permission就更细化了,具体到了莫个对象你可以操作的功能的权限,

      比如
A用户建立了一个TableA表,现在为了让B用户可以看到A这个对象,我们就可以把A.table的select权限 进行赋予。
这里的A.table上的select权限就是一个对象权限

    
 除了select,还有update,delete,insert,alter,drop,index,references这样正对于对象
的权限。

除了可以给表对象指定对象权限外,view,sequence,procedure,function,package,triggger,MV等
这些oracle里的对象都可以进行对象的权限指定。

        
对于对象权限来说,由于对象权限完全是动态的,在对一个对象进行grant的时候,才能看到具体的对象权限,所以对象权限是不像system
privilege那样有一个表来描述的,只有一个表来记录用户和这个用户对于的对象权限的关系表。这个表就是dba_tab_privs;

这里这个名字比较容易让人误会为只有table的对象权限,其实不然,这里其他类型的对象的对象权限也会记录进来

      
 实验一下。还是刚才的test1用户。我现在把对象dbms_xplan的execute的权限给他。dbms_xplan这个有些朋友可能
不熟悉,这是执行计划有关的一个对象,朋友们如果没有安装执行计划的包。可以用dbms_output对象做实验

SQL>grant execute on dbms_xplan to test1;

SQL>grant execute on dbms_output to test1;

SQL> select * from dba_tab_privs where grantee = 'TEST1';

GRANTEE                
       OWNER          
               TABLE_NAME  
                  GRANTOR
                   
   PRIVILEGE              
                 GRANTABLE
HIERARCHY

------------------------------ ------------------------------
------------------------------ ------------------------------
---------------------------------------- --------- ---------

TEST1                  
       SYS            
               DBMS_XPLAN
                   
SYS                  
         EXECUTE        
                   
     NO        NO

TEST1                  
       SYS            
               DBMS_OUTPUT
                   SYS
                   
       EXECUTE  

        这里注意和fuanction
不同的,这里有一个GRANTABLE的字段,意味和上面admin option一样的作用

不过这里的sql不同了

SQL>grant execute on dbms_xplan to test1 with grant option;

这里是oracle里的权限了,

不过有的人可能会问道,咦,你是不是漏掉了,不是我们还可以

grant connect, resource, dba to username;吗,那她们都是什么权限呀。

           在这里就要注意了,这里的connct resource
dba都不是权限,而是一个role,角色,一个角色是1个或者多个系统权限或者对象权限的集合。
是便于我们管理用户赋权而演化而来的, 这里的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 test1;

我们可以通过dba_role_privs来查询相关用户的role的赋予,比如

SQL> select * from dba_role_privs where grantee = 'TEST1';

GRANTEE                
       GRANTED_ROLE        
          ADMIN_OPTION DEFAULT_ROLE

------------------------------ ------------------------------
------------ ------------

TEST1                  
       CONNECT          
             NO      
    YES

TEST1                  
       RESOURCE          
            NO        
  YES

TEST1                  
       PLUSTRACE          
           NO        
  YES

TEST1                  
       SELECT_CATALOG_ROLE      
     NO           YES

这里有admin_option的选项和上面一样。

        
 最后我们在来看看sysdba和sysoper,我们也可以在grant里指定这两个权限,但是他们并不是权限,也不能理解为角色,我这里个
人把他们理解为身份,是登录数据库的一种身份,这样一说你是不是有影响了、我们总是有 sqlplus / as
sysdab这样的使用,其实这里的sysdba是一种身份。

SQL>grant sysdba to test1;

SQL>grant sysoper to test1;

SQL> select * from V$pwfile_users where username = 'TEST1';

USERNAME                
      SYSDBA SYSOPER

------------------------------ ------ -------

 TEST1                
         TRUE   TRUE

      
 这里是通过动态视图V$pwfile_users来查的,和上面一些数据表不同,这个是一个动态视图,是从密码文件里读出来的。

以上就是个人对oracle的权限的总结。然后这里仅是一斑窥豹而已,oracle是个很系统的体系结构,我们只有从每个知识点深入进去,对每个知
识点不纠其烦的仔细研究,才有可能能正真的认知到oracle的知识。这才是oracle的迷人之处。

抱歉!评论已关闭.