我在创建视图的过程中有一个动态sql。如果我打印字符串并手动执行它,我就可以创建视图了。但是在该过程中,由于权限不足而抛出异常。我已经为用户授予了执行,创建,所有程序,但它仍然无效。有什么建议吗?
答案 0 :(得分:5)
在内部包中,间接(通过角色)授予的权限将被删除。您必须直接向帐户授予 基础对象 所需的权限;例如:
conn sys/sys@DB as sysdba
create user A identified by A;
grant connect, dba to A;
conn A/A@DB
create table test_tab(pk number);
conn sys/sys@DB as sysdba
create user B identified by B;
grant connect, dba to B;
conn B/B@DB
select * from A.test_tab; -- this works
create or replace procedure do_it as
l_cnt pls_integer;
begin
select count(*) into l_cnt from A.test_tab; -- error on compile
end;
在此示例中,您需要
grant select on A.test_tab to B;
使其工作(无论您使用的是动态SQL还是静态SQL都无关紧要。)
答案 1 :(得分:3)
根据您提供的少量信息,我的猜测是该过程使用定义权限(默认值)运行,并且过程的所有者没有创建视图所需的权限。目前尚不清楚您的案例中的适当解决方案是创建具有调用者权限的过程,还是为过程所有者授予其他权限。
发布实际代码总是有帮助的。该程序是否具有定义者或调用者权利?应该创建哪个模式的视图呢?您执行的实际授权声明是什么?