asg*_*eo1 7 oracle permissions role view
我在 Oracle 10g 中遇到权限问题。我希望有人可以帮助我理解这一点。
我有一个带有表格的架构。我已将该表上的 select 授予一个角色。
grant select on user1.example_table to example_role;
Run Code Online (Sandbox Code Playgroud)
然后我将该角色授予用户:
grant example_role to user2;
Run Code Online (Sandbox Code Playgroud)
然后 user2 想在该表的顶部创建一个视图:
create or replace view user2.example_view as
select *
from user1.example_table;
Run Code Online (Sandbox Code Playgroud)
但是,这会引发错误:
ORA-01031: insufficient privileges
Run Code Online (Sandbox Code Playgroud)
为什么?如果他们通过角色拥有选择权限,为什么他们不能在该对象上创建视图?
我发现我必须将对象直接授予用户才能工作。
grant select on user1.example_table to user2;
Run Code Online (Sandbox Code Playgroud)
无论如何不必这样做吗?我想使用角色,因为我有很多表和很多用户,并且不想为单个用户维护一百万个不同的授权。
从手册:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_8004.htm#i2065510
包含视图的架构的所有者必须具有从视图所基于的所有表或视图中选择、插入、更新或删除行所需的权限。所有者必须直接被授予这些权限,而不是通过角色。
(重点是我)
所以我想没有办法解决这个问题。
虽然您可能有很多用户,但他们需要自己的视图是不寻常的。视图应该在一个架构中(可能是拥有表的架构),用户应该通过在架构名称前加上前缀(例如 vwowner.view)或使用
ALTER SESSION SET_CURRENT_SCHEMA=vwowner
Run Code Online (Sandbox Code Playgroud)
角色是短暂的。您可以执行 SET ROLE NONE 将它们全部关闭。您可以为同一个帐户启用多个会话并启用不同的角色。这与 Oracle 处理对象的方式不兼容(它们要么有效,要么无效;它们对某些会话无效,而对其他会话无效)。
简单的解释是该软件的设计不允许这样做。正如 Gary 指出的那样,由于角色被设计为能够打开和关闭,因此视图可能对某些会话有效,而对其他会话无效。但是,系统可以设计为允许角色工作。
我们需要的是一个持久的角色或者一个类似于角色的设备,这个角色永远开启并且不能被禁用。对于将来自另一个模式的数据连接到当前模式中的数据的视图等情况,这将是对 Oracle 的有用补充。如果即使是少量模式只使用几个表来执行此操作,那么持久性角色的时间和维护节省将是值得的。
作为一种解决方法,您可以创建一个过程,将一组表的权限授予给定用户,然后为您授予角色的每个用户运行该过程。您甚至可以向过程传递一个角色名称并让它生成所需的内容,但最终它仍然是一个笨拙的解决方案。
归档时间: |
|
查看次数: |
27413 次 |
最近记录: |