我想利用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权限的,怎么会提示权限不足呢?
请问应该怎么调试能正常执行?
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权限的,怎么会提示权限不足呢?
请问应该怎么调试能正常执行?
之后还是提示权限不足
如果没有权限的话,那编译怎么会成功呢?
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所屬用戶下的對象。但这种做法,只创建了表结构,没有索引和主键。
如何来添加主键和索引?有待更好的方案