oracle - 尽管有授权,但无法创建访问其他模式对象的 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 模式中所有表的选择权限,可以在下面看到它的工作原理。
解决方案
在上层环境中工作,唯一的区别是角色提供的授权......在其他环境中,SELECT 授权直接在对象上提供。
如文档中所述(强调添加):
包含视图的模式的所有者必须具有从视图所基于的所有表或视图中选择(
READ
或特权)、插入、更新或删除行所需的特权。所有者必须直接被授予这些权限,而不是通过角色。SELECT
如果您只有通过 aa 角色授予的基础表上的 select 特权,那么您无法针对它创建视图。即使您通常转为角色,您也必须为要创建的任何视图保留显式授权。
我想这与角色的工作方式有关。通过直接授权,Oracle 知道您是否可以在其他模式中看到该表。如果您将视图上的选择权限授予其他人,那么当他们查询视图时,Oracle 知道权限链就在那里。如果您对表的直接授权被撤销,则存在使依赖对象无效的机制。但是该角色对表的选择权限被撤销应该发生什么?或您对该角色的访问权限被撤销;或者只是在您自己的会话中,如果您禁用该角色会发生什么 - 您仍然可以访问视图吗?乍一看,它有点复杂。
幸运的是,创建视图应该是相对少见且可控的。大多数通过角色访问表的人不需要在其上创建视图(我假设!)。
这里的另一个选项是在ARIEL
模式中创建视图,然后授予权限APEX_ARIEL
和/或角色。这是否合适取决于您的真实视图查询和创建视图的动机。
推荐阅读
- heroku - Heroku 仪表板错误
- python - Python Web Scraper IEEE
- python - 如何为 python 竞争性编程环境设置 Sublime Text
- json - 元掩码错误:内部 JSON-RPC 错误。在 metamask 手机上确认时
- google-sheets - Google 表格:TypeError:无法读取未定义的属性“范围”
- python - 将对象形式的日期转换为整数和年份的样本
- javascript - 如何在渲染后只调用一次函数?
- python - 在特定时间段内的日期上添加一个小时 Pandas
- c# - 使用实体框架联合复合时使两列唯一
- c# - 您正在尝试使用“新”关键字创建 MonoBehaviour。这是不允许的