Oracle 选择通过直接授予和通过角色授予的权限

Oracle 选择通过直接授予和通过角色授予的权限,oracle,plsql,privileges,Oracle,Plsql,Privileges,我拥有通过Oracle角色授予的SELECT权限,可以查看特定表中的数据。(我的acc拥有(或属于)为特定表授予SELECT prvilege权限的角色) 但是,为了使视图或过程能够从同一个表中选择数据,我必须拥有直接授予acc的SELECT权限 为什么?为什么通过角色选择授权是不够的?在PL/SQL过程中角色被关闭。您可以在不使用角色的情况下使用 SET ROLE NONE; SELECT * FROM session_roles; 您可以使用查看当前角色 SET ROLE NONE;

我拥有通过Oracle角色授予的SELECT权限,可以查看特定表中的数据。(我的acc拥有(或属于)为特定表授予SELECT prvilege权限的角色)

但是,为了使视图或过程能够从同一个表中选择数据,我必须拥有直接授予acc的SELECT权限


为什么?为什么通过角色选择授权是不够的?

在PL/SQL过程中角色被关闭。您可以在不使用角色的情况下使用

SET ROLE NONE;
SELECT * FROM session_roles;
您可以使用查看当前角色

SET ROLE NONE;
SELECT * FROM session_roles;
要重新打开它们,请执行以下操作:

SET ROLE ALL;

我不知道甲骨文是否给出了角色被关闭的原因。我一直认为这是为了提高性能。每次执行之前,都会检查您是否有权访问查询中的所有表。如果允许角色(可以授予其他角色),则需要相当复杂的树/图查询来确定访问是否正常。只有直接权限,这具有线性复杂性。

因为Oracle很久以前就认为这是一件好事。为什么他们决定只有Oracle可以回答。这里解释:角色基本上是暂时的,可以启用、禁用、密码保护等,但编译器需要知道编译时它的确切位置。@WilliamRobertson感谢链接!我喜欢Tom的区别“角色是为……最终用户提供的”,而直接priv是为应用程序对象提供的。