选择视图但未选择基础表时出现“ ORA-01031:特权不足”

时间:2018-08-22 15:00:44

标签: oracle

我有一个定义如下的视图:

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:特权不足”

1 个答案:

答案 0 :(得分:3)

假设您已被授予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可以查询视图;但不能直接查询基础表。