2011-06-29 202 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

我的猜測基於您提供的信息很少,是程序運行時使用了定義者權限(默認值),程序的所有者沒有創建視圖所需的權限。您的案例中的合適解決方案是否使用調用者權限創建過程或向過程所有者授予其他特權尚不清楚。

發佈實際代碼總是有幫助的。程序是否具有定義者或調用者權限?應該創建哪個模式視圖?你執行的實際授權聲明是什麼?