用戶具有dba權限,但在執行一個存儲過程時提示“ORA-01031: 權限不足”,該過程中存在動態SQL“execute immediate。。。”正是這里報的錯誤。
1、ORACLE默認為定義者權限,定義者權限在存儲過程中ROLE無效,需要顯示授權。
2、如果使用AUTHID CURRENT_USER關鍵字使用調用者權限,則編譯時ROLE無效,運行時有效。
解決辦法:
方法1:就這個存儲過程來說,CREATE TABLE想使用CREATE ANY TABLE權限,而CREATE ANY TABLE權限來自DBA角色,默認情況下,雖然在會話環境中可見,但在存儲過程中不可見(無效)。
所以根據上面的第一條規則,可以顯示地將CREATE ANY TABLE權限授予cog就可以了,即
GRANT CREATE ANY TABLE TO COG;
方法2:采用調用者權限,由於過程中使用動態SQL,所以可以避開編譯時的檢查,但在運行時DBA角色生效,即
CREATE OR REPLACE PROCEDURE INSERT_DATA --插入user_客戶ID,套餐表,客戶寬表
(RTN_ID OUT NUMBER, --返回錯誤ID
RTN_STR OUT VARCHAR --返回錯誤敘述
) AUTHID CURRENT_USER IS
...................
參見:http://bbs.csdn.net/topics/360200923