Oracle &引用;ORA-01031:特权不足“;选择视图而不是基础表时
我的观点是这样定义的:Oracle &引用;ORA-01031:特权不足“;选择视图而不是基础表时,oracle,Oracle,我的观点是这样定义的: SELECT pi.Role, pi.created_date, pi.last_upd_date, pi.person_id FROM other_schema.table_a pi WHERE ...; 但是当我编译它时,我得到一个错误:“ORA-01031:权限不足” 如果我尝试运行用于定义视图的sql(在创建视图之外),它将正确执
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
返回:已创建视图“视图1”
SELECT * FROM VIEW_1
返回:ORA-04063:视图“视图1”有错误
SELECT
pi.Role,
pi.created_date,
pi.last_upd_date,
pi.person_id
FROM
other_schema.table_a pi
返回:表a中的数据
当查看视图中的错误时,我看到:“ORA-01031:权限不足”假设您已被授予
创建视图
权限,以允许您在自己的架构中创建视图,这样做可以:
create or replace view view_1 as
select * from dual;
View VIEW_1 created.
select * from view_1;
D
-
X
。。。然后,这看起来像是一个关于如何将另一个模式中的表特权授予用户的问题。作为演示,作为用户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;
然后作为用户2
:
select * from session_roles;
ROLE
------------------------------
SOME_ROLE
...
select * from user_1.table_a;
PERSON_ID
----------
42
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
我可以通过授予角色的权限查看该表。但如果我尝试创建一个视图:
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
选择权限必须直接授予创建视图的用户;再次作为用户\u 1
:
grant select on table_a to user_2;
然后作为用户2
:
select * from session_roles;
ROLE
------------------------------
SOME_ROLE
...
select * from user_1.table_a;
PERSON_ID
----------
42
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.
现在
用户_3
可以查询视图;但无法直接查询基础表。假设您已被授予创建视图
权限,允许您在自己的架构中创建视图,以便:
create or replace view view_1 as
select * from dual;
View VIEW_1 created.
select * from view_1;
D
-
X
。。。然后,这看起来像是一个关于如何将另一个模式中的表特权授予用户的问题。作为演示,作为用户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;
然后作为用户2
:
select * from session_roles;
ROLE
------------------------------
SOME_ROLE
...
select * from user_1.table_a;
PERSON_ID
----------
42
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
我可以通过授予角色的权限查看该表。但如果我尝试创建一个视图:
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
选择权限必须直接授予创建视图的用户;再次作为用户\u 1
:
grant select on table_a to user_2;
然后作为用户2
:
select * from session_roles;
ROLE
------------------------------
SOME_ROLE
...
select * from user_1.table_a;
PERSON_ID
----------
42
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.
现在
用户_3
可以查询视图;但无法直接查询基础表。该表是否位于不同的架构中?您没有显示架构前缀,但我猜是的?您对它的选择权限是通过角色授予的,而不是直接?以下是您所看到的:@AlexPoole您是否建议禁用基于角色的权限,从视图中选择在过程中禁用权限的方式?我想我从来没有读过。但是关于视图位于另一个模式中,您可能是对的。视图的所有者需要通过授予选项将此视图上的选择授予anthonylynch
。可能与@Matthewmpeak重复-标题有点混乱,但问题主体说错误在于编译/定义(即创建)时,而非查询时。不过,澄清一下可能会有帮助。该表是否位于不同的架构中?您没有显示架构前缀,但我猜是的-并且您对它的选择权限是通过角色授予的,而不是直接?以下是您所看到的:@AlexPoole您是否建议禁用基于角色的权限,从视图中选择在过程中禁用权限的方式?我想我从来没有读过。但是关于视图位于另一个模式中,您可能是对的。视图的所有者需要通过授予选项将此视图上的选择授予anthonylynch
。可能与@Matthewmpeak重复-标题有点混乱,但问题主体说错误在于编译/定义(即创建)时,而非查询时。不过澄清会有帮助。不幸的是,这不是问题所在。我在你发布后澄清了这一点,但我没有得到这个ORA-01031:创建视图时权限不足。我能够创造它。我只是无法编译,或者无法从中选择(因为视图无法编译)。这是相同的基本问题(如果您有create view
privs),您似乎只是在执行create force view view\u 1 force…
,这会将视图对象创建为无效;我的演示没有强制执行,因此不会创建它,并且会立即报告错误。我在执行时复制/粘贴了查询结构,但查询中没有强制执行。@AnthonyLynch-我认为您的客户端正在添加它。我对读到蟾蜍那样做有模糊的记忆,但我可能错了。。。不过这并不重要。你会说话吗