日期:2014-05-16  浏览次数:20472 次

oracle的显式授权和隐式授权(转)
原文:http://www.blogjava.net/haha1903/archive/2010/03/05/314577.html
编译 Trigger 出错 -- Oracle 的显式授权

编译 Trigger 出错,错误的原因是找不到sequence,但是在 sql 里面使用这个sequence非常正常。找了半天原因,另一个同事试了一下给这个sequence授权,就可以编译通过了。
疑惑了很久,为什么sql中可以用,编译trigger就不能用了呢。
查了一些资料,才明白。
是因为 Oracle 在编译Procedu的时候,只检查当前用户的权限,而不管角色。所以,即使这个用户是DBA,也没有用,必须要对这个用户授权。这就是显式授权。
我在CSDN上找到了一个很好的文章,解释了显式授权和隐式授权的区别。
附在下面。

来自CSDN博客,http://blog.csdn.net/pashine/archive/2009/12/21/5050060.aspx


oracle 对象的授权
Oracle授权

?

一、授权语法
GRANT 语法:

1.显式授权(直接将对象授权给用户)
?GRANT privilege [, ...] ON object [, ...]? TO? { Public| Group | Username|role} [WITH GRANT OPTION ]?
??
2.隐式授权(通过将角色授权给用户)
?GRANT role TO? { Public| Group | Username|role}

语法说明:

privilege (权限)
?? 可能的权限有:
???? SELECT--访问声明的表/视图的所有列/字段.
???? INSERT--向声明的表中插入所有列字段.
???? UPDATE--更新声明的所有列/字段.
???? DELETE --从声明的表中删除所有行.
???? RULE?? 在表/视图上定义规则 (参见 CREATE RULE 语句).
???? ALL 赋予所有权限.

object 赋予权限的对象名.
??? 可能的对象是:?
???? table (表)
???? view (视图)
???? sequence (序列)
???? index (索引)
Public??? 代表是所有用户的简写.
Group???? 将要赋予权限的组GROUP .目前的版本中,组必须是用下面方法显式创建的.
Username? 将要赋予权限的用户名.PUBLIC 是代表所有用户的简写.
role????? 某个角色,(如DBA)
WITH GRANT OPTION 允许向别人赋予同样权限,被授权的用户可以继续授权.


描述
??? 对象创建后,除了创建者外,除非创建者赋予(GRANT)权限,其他人没有访问对象的权限。
??? GRANT 允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限。不需要给创建者赋予(GRANT)对象的权限,创建者自动拥有对象的所有权限,包括删除它的权限。

说明

Oracle不允许在过程中使用未经显式授权的对象. 要使用另一用户的对象,必须通过另一用户给自己显示授权。

因为Oracle在编译存储过程时并不检查定义者拥有的角色,只是检查其被显式授予的权限,而DBA也是一种角色,所以即使是DBA,也需要显式授权。

?

二、授权方式 (显式和隐式)
? 对象授权有两种模式,显式和隐式:?
显示授权和隐式授权的区别是:显示授权是直接把对象授权给用户,隐式授权是给用户授予角色的方式来实现授权。

1. 显式授权是直接用GRANT语句进行授权。
?语法:GRANT 某种权限 TO 用户
如:
? CONN? USER1/Password
? GRANT SELECT? ON TABLE1 TO USER2;??? --- 将user1的表TABLE1的select 权限显示授权给user2
? GRANT UPDATE? ON TABLE1 TO USER2;??? --- 将user1的表TABLE1的update权限显示授权给user2


? 注:用system/manager登录是没法授权的,要使USER2用户能在存储过程里面访问USER1用户的表,必须以USER1用户(该用户有dba权限)登录,然后授权就可以了。
? SQL>grant select on USER1.MA_USERINFO to USER2

2.隐式授权则是通过ROLE来授权。
?语法:GRANT 某个角色 TO 用户
如:?
? CONN? USER1?
? GRANT SELECT ON TABLE1 TO ROLE1;???? --- 将USER1的表TABLE1的select权限显示授权给Role1
? CONN? SYSTEM?
? GRANT ROLE1 TO USER2;??????????????? --- 给USER2授与Role1的权限。


三、收回权限
?? 语法:
?????? revoke 权限 from 用户;

?? 例子:

  revoke select on table1 from User1; 收回查询select表的权限;
  revoke all??? on table1 from User1;
??? grant? connect to xujin;
  revoke? connect? from xujin

????? revoke? ROLE1??? from USER2;

End

1 楼 hlw_bj 2011-09-20