我想利用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权限的,怎么会提示权限不足呢?
请问应该怎么调试能正常执行?
解决方案 »
- Oracle 如何设置不区分大小写查询(索引,全表扫描)?
- 问一下powerdesigner建oracle表时几个缩写字母的意思
- oracle10g listener.ora tnsnames.ora sqlnet.ora 的配置问题 在线等,谢谢
- oracle如何获得一张表所在的数据库名
- 提示错误"ORA-01502: 索引''或这类索引的分区处于不可用状态"
- 为什么从大对象里读出来的都是????
- Oracle9i 下如何随即产生不重复的数,在线等
- Oracle 安装问题?
- 还有懂Oracle(for Linux/Unix)的朋友在吗?!
- 怎样用Oracle Database Assistant建立数据库?高手进
- 3des 特殊字符问题
- 在oracle中如何将varchar类型转换成raw类型
之后还是提示权限不足
如果没有权限的话,那编译怎么会成功呢?
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所屬用戶下的對象。但这种做法,只创建了表结构,没有索引和主键。
如何来添加主键和索引?有待更好的方案