2015-11-02 46 views
1

我有程序創建對象krn_ddl_mgr,所以肌酸看起來像這樣:ora1031上創建表裏面執行即時

begin 
    krn_ddl_mgr.create_object('create table krn_modules 
    ( 
     id   varchar2(30 byte), 
     description varchar2(4000 byte) 
    ) 
    tablespace MDLDATA 
    rowdependencies'); 
end; 
/

,並拋出ora1031權限不足異常。目前僅在程序

procedure create_object(p_sql in clob) is 
    begin 
    execute immediate p_sql; 
    dbms_output.put_line('create_object done'); 
    exception 
    when others then 
     case 
     when (lower(p_sql) like ('create%')) and sqlcode = -955 or sqlcode = -2264 then 
      null; 
     when lower(p_sql) like ('alter% primary %') and sqlcode = -2260 or sqlcode = -2261 then 
      null; 
     when lower(p_sql) like ('alter% check %') and sqlcode = -2264 then 
      null; 
     when lower(p_sql) like ('alter% references %') and sqlcode = -2275 then 
      null; 
     else 
      raise; 
     end case; 
    end create_object; 

執行即時操作的時候,不使用程序,使用時只需創建表或創建表內執行它的工作原理立即聲明。另外我試圖創建的create_object過程和表都在一個模式中。爲什麼會發生?

回答

2

我猜krn_ddl_mgr的所有者已被授予通過角色創建表的權限。

問題是,通過角色授予的權限在PL/SQL內部是不活動的。您需要將必要的權限直接授予包的所有者,而不是通過角色。