【问题标题】:"ORA-01031: insufficient privileges " when selecting view but not underlying table“ORA-01031: 权限不足” 选择视图而非基础表时
【发布时间】:2019-01-28 21:16:14
【问题描述】:

我有一个这样定义的视图:

SELECT 
        pi.Role, 
        pi.created_date, 
        pi.last_upd_date,
        pi.person_id
    FROM 
        other_schema.table_a pi      
    WHERE 
        ...;

但是当我编译它时,我得到一个错误:“ORA-01031:权限不足”

如果我尝试运行用于定义视图的 sql(在创建视图之外),它会正确执行。我是否缺少将其作为视图执行的权限?

为清晰而编辑:

CREATE VIEW VIEW_1 AS
SELECT 
        pi.Role, 
        pi.created_date, 
        pi.last_upd_date,
        pi.person_id
    FROM 
        other_schema.table_a pi

返回:视图“VIEW_1”已创建。

SELECT * FROM VIEW_1

返回:ORA-04063:视图“VIEW_1”有错误

SELECT 
        pi.Role, 
        pi.created_date, 
        pi.last_upd_date,
        pi.person_id
    FROM 
        other_schema.table_a pi

返回:table_a 中的数据

查看视图中的错误时,我看到:“ORA-01031:权限不足”

【问题讨论】:

  • 表是否在不同的架构中 - 您没有显示架构前缀,但我猜是这样 - 您对它的选择权限是通过角色授予的,而不是直接授予?跨度>
  • 这就是你要找的东西:stackoverflow.com/questions/20595701/…
  • @AlexPoole 您是否建议禁用基于角色的特权,从视图中选择它们在过程中禁用的方式?我想我从来没有读过那个。但是您可能对视图位于另一个模式中是正确的。视图的所有者需要GRANT SELECT ON thisview TO anthonylynch WITH GRANT OPTION
  • @MatthewMcPeak - 标题有点令人困惑,但问题主体说错误是在编译/定义(即创建)时,而不是在查询时。不过,澄清会有所帮助。

标签: oracle


【解决方案1】:

假设您已被授予 create view 权限以允许您在自己的架构中创建视图,这样就可以了:

create or replace view view_1 as
select * from dual;

View VIEW_1 created.

select * from view_1;

D
-
X

...那么这看起来像是一个问题,即如何将另一个模式中的表上的权限授予用户。作为演示,作为user_1

create table table_a (person_id number);
grant select on table_a to some_role;
insert into table_a (person_id) values (42);
commit;

然后作为user_2:

select * from session_roles;

ROLE                          
------------------------------
SOME_ROLE
...

select * from user_1.table_a;

 PERSON_ID
----------
        42

我可以通过授予我的角色的权限查看该表。但如果我尝试创建一个视图:

create or replace view view_1 as
select * from user_1.table_a;

ORA-01031: insufficient privileges

或匹配您似乎实际在做的事情,尽管报告编译的确切方式取决于您使用的客户端:

create or replace force view view_1 as
select * from user_1.table_a;

Warning: View created with compilation errors.

select * from view_1;

SQL Error: ORA-04063: view "USER_2.VIEW_1" has errors

show errors view view_1;

LINE/COL ERROR
-------- ------------------------------------------------
0/0      ORA-01031: insufficient privileges

选择权限必须直接授予创建视图的用户;再次作为user_1

grant select on table_a to user_2;

然后作为user_2:

create or replace force view view_1 as
select * from user_1.table_a;

View VIEW_1 created.

select * from view_1;

 PERSON_ID
----------
        42

或者如果之前使用force 创建它应该只是自动重新编译并在您再次查询时工作,而无需显式重新创建或重新编译它。


还有一个问题,可能对您的情况很重要,也可能无关紧要。此时我不能让其他用户看到视图:

grant select on view_1 to user_3;

ORA-01720: grant option does not exist for USER_1.TABLE_A'

为了能够做到这一点,我必须能够将基础表的可见性扩展到其他用户。我真的不想这样做,但这实际上就是我正在做的事情——至少,对于数据而不是实际的表格。为了让这种情况发生,user_1 必须这样做:

grant select on table_a to user_2 with grant option;

然后作为user_2 我现在可以这样做了:

grant select on view_1 to user_3;

Grant succeeded.

现在user_3可以查询视图了;但不能直接查询底层表。

【讨论】:

  • 不幸的是,这不是问题所在。我在您发布后澄清了它,但我没有得到这个 ORA-01031:创建视图时权限不足。我能够创建它。我只是无法编译或从中选择(因为视图无法编译。)
  • 这是相同的潜在问题(如果您仍然有create view privs)-您似乎只是在做create force view view_1 force ...,这会将视图对象创建为无效;我的demo没有强制,所以没有创建,马上报错。
  • 我在执行时复制/粘贴了查询结构,查询中没有强制。
  • @AnthonyLynch - 我认为您的客户正在添加它。我有一个模糊的记忆,读到蟾蜍会这样做,但我可能是错的……不过这并不重要。你能创建对偶的简单视图吗?如果是这样,直接向用户授予选择权限是否可以解决您的问题?
猜你喜欢
  • 2010-09-13
  • 2013-04-14
  • 2021-12-30
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多