当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
关于ORACLE的权限赋予问题
发布时间:2010/12/12 20:20:28 来源:城市学习网 编辑:ziteng
  我们经常谈及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
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved