我想利用DBLINK在本地数据库A创建一个和数据库B一样的表,只要表结构,不需要数据。写了以下存储过程。
create or replace procedure proc_createtable
is
  sqlt varchar2(200);
  zd varchar2 (100);
  CURSOR  tb is (select * from user_tables@easdb where table_name like 'T_%');
  R_emp tb%ROWTYPE;
begin
    open tb;
     loop
       fetch tb into R_emp;
       exit when tb%  notfound;
       zd:= R_emp.table_name;
       sqlt :=  ' create table  ' ||zd ||'  as select * from  ' ||zd||'@easdb where 1 = 0' ;
       execute immediate sqlt ;
     end loop;
   close tb;
end;编译成功。但执行时提示 
ORA-01031: 权限不足
ORA-06512: 在 "EASTEST.PROC_CREATETABLE", line 14
ORA-06512: 在 line 2
用户是有DBA权限的,怎么会提示权限不足呢?
请问应该怎么调试能正常执行?

解决方案 »

  1.   

    过程中进行操作需要用户本身的权限,即显式授权。DBA是个角色,角色权限在过程中无效
      

  2.   

    grant create any procedure to eastest;
    之后还是提示权限不足
    如果没有权限的话,那编译怎么会成功呢?
      

  3.   

    已经搞定。
    create or replace procedure proc_createtable 后面加个Authid Current_User   存储过程默认是用定义者definer 的身份调用的,如果加上AUTHID CURRENT_USER,则用当前登陆的用户权限调用,如果该过程的调用者(而非定义者)被授与系统权限execute any procedure或是被该过程的定义者grant execute on授权的话,不用这个AUTHID CURRENT_USER子句,调用者照样可以使用这个过程。
        另外,在Oracle的存儲過程中,如果涉及到操作不同schema下的對象的時候,可以在不同的schema下寫相同的procedure,但這樣帶來的問題是維護和同步帶來了麻煩,可以在procedure中加上authid current_user,來說明procedure中操作的對象是當前連接用戶的對象而并不是procedure所屬用戶下的對象。但这种做法,只创建了表结构,没有索引和主键。
    如何来添加主键和索引?有待更好的方案