首页 > 解决方案 > 尽管有授权,但无法创建访问其他模式对象的 Oracle 视图

问题描述

我有 2 个模式:

ARIEL ARIEL_APEX

ARIEL_APEX 可以访问 ARIEL 中的所有表,并且查询可以从 ARIEL_APEX 模式运行。

例如,

SELECT * FROM ARIEL.DIM_REGISTRATION_SET

在 ARIEL_APEX 模式下工作正常。

当我尝试在 ARIEL_APEX 中创建视图时:

CREATE VIEW TEST_VIEW AS
SELECT * FROM ARIEL.DIM_REGISTRATION_SET

我明白了:

Error at Command Line : 465 Column : 23
Error report -
SQL Error: ORA-01031: insufficient privileges
01031. 00000 -  "insufficient privileges"
*Cause:    An attempt was made to change the current username or password
           without the appropriate privilege. This error also occurs if
           attempting to install a database without the necessary operating
           system privileges.
           When Trusted Oracle is configure in DBMS MAC, this error may occur
           if the user was granted the necessary privilege at a higher label
           than the current login.
*Action:   Ask the database administrator to perform the operation or grant
           the required privileges.
           For Trusted Oracle users getting this error although granted the
           the appropriate privilege at a higher label, ask the database
           administrator to regrant the privilege at the appropriate label.

这在测试和生产环境中工作得非常好,这就是开发。DBA 说一切都很好。

ARIEL_APEX having below privileges.

GRANTEE                        PRIVILEGE
------------------------------ ----------------------------------------
ARIEL_APEX                     CREATE JOB
ARIEL_APEX                     CREATE MATERIALIZED VIEW
ARIEL_APEX                     CREATE TABLE
ARIEL_APEX                     CREATE OPERATOR
ARIEL_APEX                     CREATE VIEW
ARIEL_APEX                     CREATE TYPE
ARIEL_APEX                     CREATE SYNONYM
ARIEL_APEX                     CREATE CLUSTER
ARIEL_APEX                     CREATE DIMENSION
ARIEL_APEX                     CREATE TRIGGER
ARIEL_APEX                     CREATE SESSION
ARIEL_APEX                     CREATE INDEXTYPE
ARIEL_APEX                     CREATE PROCEDURE
ARIEL_APEX                     CREATE SEQUENCE

而且我们知道 ARIEL 对象对 ARIEL_APEX 的授权是可以的,因为我们可以手动执行查询。

这是 Oracle 12。在我们升级之前从未遇到过问题,但怀疑这与从视图中的另一个模式访问对象有关。

ARIEL_APEX 是 ANALYTICS_ROLE 的成员,ANALYTICS_ROLE 授予对 ARIEL 模式中所有表的选择权限,可以在下面看到它的工作原理。

该授权提供给 ANALYTICS_ROLE,它授予对所有 ARIEL 表的 SELECT 访问权限。

从 ARIEL 表的 ARIEL_APEX 模式直接执行查询可以看出,授权是有效的。 尝试围绕工作查询创建视图时出错。

标签: oracle

解决方案


在上层环境中工作,唯一的区别是角色提供的授权......在其他环境中,SELECT 授权直接在对象上提供。

文档中所述(强调添加):

包含视图的模式的所有者必须具有从视图所基于的所有表或视图中选择(READ或特权)、插入、更新或删除行所需的特权。所有者必须直接被授予这些权限,而不是通过角色。SELECT

如果您只有通过 aa 角色授予的基础表上的 select 特权,那么您无法针对它创建视图。即使您通常转为角色,您也必须为要创建的任何视图保留显式授权。

我想这与角色的工作方式有关。通过直接授权,Oracle 知道您是否可以在其他模式中看到该表。如果您将视图上的选择权限授予其他人,那么当他们查询视图时,Oracle 知道权限链就在那里。如果您对表的直接授权被撤销,则存在使依赖对象无效的机制。但是该角色对表的选择权限被撤销应该发生什么?或您对该角色的访问权限被撤销;或者只是在您自己的会话中,如果您禁用该角色会发生什么 - 您仍然可以访问视图吗?乍一看,它有点复杂。

幸运的是,创建视图应该是相对少见且可控的。大多数通过角色访问表的人不需要在其上创建视图(我假设!)。

这里的另一个选项是在ARIEL模式中创建视图,然后授予权限APEX_ARIEL和/或角色。这是否合适取决于您的真实视图查询和创建视图的动机。


推荐阅读