我有一个定义如下的视图:
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:特权不足”
答案 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
可以查询视图;但不能直接查询基础表。