2011-06-29 162 views
1

我在创建视图的过程中有一个动态sql。如果我打印字符串并手动执行,我可以创建视图。但是,在该过程中,由于特权不足而引发异常。我已经授予执行,创建,所有程序给用户,但它仍然不起作用。有什么建议么?Oracle授予执行权限

回答

5

在包内部,间接(通过角色)授予的特权被删除。您必须直接向帐户授予底层对象必需的权限;例如:

conn sys/[email protected] as sysdba 
create user A identified by A; 
grant connect, dba to A; 
conn A/[email protected] 
create table test_tab(pk number); 

conn sys/[email protected] as sysdba 
create user B identified by B; 
grant connect, dba to B; 
conn B/[email protected] 
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)。

3

我的猜测基于您提供的信息很少,是程序运行时使用了定义者权限(默认值),程序的所有者没有创建视图所需的权限。您的案例中的合适解决方案是否使用调用者权限创建过程或向过程所有者授予其他特权尚不清楚。

发布实际代码总是有帮助的。程序是否具有定义者或调用者权限?应该创建哪个模式视图?你执行的实际授权声明是什么?