当我尝试执行包含来自不同模式的表的视图时,会引发 ORA-001031 权限不足。这些表对创建视图的架构具有执行权限。如果我执行视图的 SQL 语句,它就可以工作。我错过了什么?
8 回答
最后我让它工作了。史蒂夫的回答是正确的,但并非适用于所有情况。当从第三个模式执行该视图时,它会失败。为此,您必须添加授权选项:
GRANT SELECT ON [TABLE_NAME] TO [READ_USERNAME] WITH GRANT OPTION;
这样,[READ_USERNAME]
还可以将视图的选择权限授予另一个模式
作为表所有者,您需要向运行 SELECT 语句的用户授予对基础表的 SELECT 访问权限。
grant SELECT on TABLE_NAME to READ_USERNAME;
问:什么时候需要“授予选项”?
A. 当您从第三个模式执行视图时。
示例:模式 DSDSW 有一个名为 view_name 的视图
a) that view selects from a table in another schema (FDR.balance)
b) a third shema X_WORK tries to select from that view
典型授权:将 dsdw.view_name 上的 select 授权给 dsdw_select_role;将 dsdw_select_role 授予 fdr;
但是:fdr 从 dsdw.view_name 获取 select count(*);第 1 行出现错误:ORA-01031:权限不足
发放补助金:
grant select on fdr.balance to dsdw with grant option;
现在 fdr:从 dsdw.view_name 中选择 count(*);5行
让我回顾一下。
当您构建包含不同所有者对象的视图时,其他所有者必须向视图的所有者授予“带有授予选项”的权限。因此,视图所有者可以授予其他用户或模式......
示例: User_a 是名为 mine_a 的表的所有者 User_b 是名为 yours_b 的表的所有者
假设 user_b 想要创建一个包含 mine_a 和 yours_b 的视图
为了使视图正常工作,user_a 必须将“将 mine_a 上的选择授予 user_b 与授予选项”
然后 user_b 可以将该视图上的选择授予每个人。
如果通过存储过程访问视图,则执行授权不足以访问该视图。您必须明确授予 select 。
如果通过存储过程访问视图,则执行授权不足以访问该视图。您必须明确授予 select 。
只需输入这个
全部公开;
要使用视图,用户必须具有适当的权限,但仅限于视图本身,而不是其底层对象。但是,如果删除了视图底层对象的访问权限,则用户将不再具有访问权限。出现此问题的原因是用户查询视图时使用的安全域是视图定义者的安全域。如果从视图的定义者中撤销对底层对象的权限,则视图将变为无效,并且任何人都无法使用该视图。因此,即使已授予用户访问视图的权限,如果定义者的权限已从视图的底层对象中撤消,则用户可能无法使用该视图。
Oracle 文档 http://docs.oracle.com/cd/B28359_01/network.111/b28531/authorization.htm#DBSEG98017
您还可以使用架构名称创建视图,例如 创建或替换视图 schema_name.view_name 为 select..