1. 程式人生 > >使用儲存過程用execute immediateSQL報ORA-01031錯誤問題的解決

使用儲存過程用execute immediateSQL報ORA-01031錯誤問題的解決

使用儲存過程用execute immediateSQLORA-01031錯誤問題的解決

2010123

14:09

  1. 遇到的問題及情況說明

  用normal使用者登入時,在執行到execute immediate s;時會出錯:報:ORA-01031insufficient privileges 許可權不足錯誤,用sysDBA登入時則不會出錯。

程式碼如下:

Sql程式碼 複製程式碼 收藏程式碼
  1. createorreplaceprocedure proc1   
  2.  (dno in number)   
  3. is
  4.  s varchar2(2000);   
  5. begin
  6.  s:='createtable is_table   
  7.  (ids number)';   
  8.  dbms_output.put_line(s);   
  9. execute immediate s;   
  10. end proc1;   
  11. call proc1(20);  
create or replace procedure proc1
 (dno in number)
 is
 s varchar2(2000);
 begin
 s:='create table is_table
 (ids number)';
 dbms_output.put_line(s);
 execute immediate s;
end proc1;
 
call proc1(20);
 

2、解決過程

網友說的解決方法:

Sql程式碼 複製程式碼 收藏程式碼
  1. createorreplaceprocedure p_create_table   
  2.     Authid Current_Useris--加上Authid Current_User即可。
  3. begin
  4. Execute Immediate 'create table create_table(id int)';   
  5. end p_create_table;  
create or replace procedure p_create_table
    Authid Current_User is--加上Authid Current_User即可。
    begin
    Execute Immediate 'create table create_table(id int)';
end p_create_table;
 

經在oracle10g/plsql7下驗證成功。

3、原理探尋

使用PLSQL Develeper可以發現Oracle對使用者的授權分為五方面的許可權,即:

一般許可權:用於登入資料庫

物件許可權:用於給使用者針對物件使用進行授權,以上的問題就是因為沒有給物件授權造成。

角色許可權:即操縱資料庫的許可權。

系統許可權:管理oracle資料庫執行的許可權。

空間限額:限制使用者空間大小。

4、總結:

  造成這個問題的原因在於使用者的許可權受到了限制。所以,按照這個邏輯,可以通過授權來解決此問題,即:

Java程式碼 複製程式碼 收藏程式碼
  1. grant       
  2.   CREATE SESSION,   
  3.     CREATE ANY TABLE,   
  4.     CREATE ANY VIEW ,   
  5.     CREATE ANY INDEX,   
  6.     CREATE ANY PROCEDURE,   
  7.     CREATE ANY TABLE   
  8.      ALTER ANY TABLE,   
  9.     ALTER ANY PROCEDURE,     
  10.   DROP ANY TABLE,   
  11.     DROP ANY VIEW,   
  12.     DROP ANY INDEX,   
  13.     DROP ANY PROCEDURE,   
  14.   SELECT ANY TABLE,   
  15.     INSERT ANY TABLE,   
  16.     UPDATE ANY TABLE,   
  17.     DELETE ANY TABLE   
  18. to users;  
grant    
  CREATE SESSION,
    CREATE ANY TABLE,
    CREATE ANY VIEW ,
    CREATE ANY INDEX,
    CREATE ANY PROCEDURE,
    CREATE ANY TABLE
     ALTER ANY TABLE,
    ALTER ANY PROCEDURE,  
  DROP ANY TABLE,
    DROP ANY VIEW,
    DROP ANY INDEX,
    DROP ANY PROCEDURE,
  SELECT ANY TABLE,
    INSERT ANY TABLE,
    UPDATE ANY TABLE,
    DELETE ANY TABLE
to users;
 

如此即可不新增Authid Current_User

有不對的地方,還請指正。