我们经常谈及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