database link 的一个问题。。。。。。。。。。。。。。。够长

mandarin 2010-01-27 04:28:50
我在数据库A中为数据库B建立了一个database link: test , 在plsql中
insert into tmenu(select * from tmenu@test);
这句单独执行是可以执行的。但是下面的就执行不成功了。

begin
delete from tmenu;
insert into tmenu(select * from tmenu@test);
commit;
exception
when others then
rollback;
raise;
end;

错误信息是:PL/SQL: ORA-00942: 表或视图不存在
ORA-06550: 第 2 行, 第 29 列:
PL/SQL: SQL Statement ignored

应该是tmenu@test这个字符串识别不了,不知道为什么。大家有没有碰到过,给小弟指点一下.........
...全文
107 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mandarin 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 luocb1980 的回复:]
在dblink的那个table前面加上schema.

declare
  v_n number(10);
begin 
  select count(*) into v_n fromusername.tmenu@test;
  dbms_output.put_line(v_n);
end;

[/Quote]

加上后可以。谢谢。 再问下能不能通过赋权来实现呢?

14lou的加同义词的方式不行,同义词转换不了,应该是同样的问题。
wwwtyb 2010-01-27
  • 打赏
  • 举报
回复
创建同义词语句:
create public synonym remote_tmenu for tmenu@test;

begin
delete from tmenu;
insert into tmenu(select * from remote_tmenu);
commit;
exception
when others then
rollback;
raise;
end;
luocb1980 2010-01-27
  • 打赏
  • 举报
回复
在dblink的那个table前面加上schema.

declare
v_n number(10);
begin
select count(*) into v_n from username.tmenu@test;
dbms_output.put_line(v_n);
end;
luocb1980 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mandarin 的回复:]
引用 5 楼 luocb1980 的回复:
declare
  v_n number(10);
begin 
  select count(*) into v_n from tmenu@test;
  dbms_output.put_line(v_n);
end;

这样报错吗?


这个报错 ,单独一句select * from tmenu@test是可以的。
[/Quote]

你建一个同义词吧
suiziguo 2010-01-27
  • 打赏
  • 举报
回复
授予你以该dblink中登录远程数据库的用户访问该表的权限。

比如你当前登录的是A库,当前使用用户为u1。
那么你建立该dblink时,是不是要你提供一个登录用户名及密码?这里的用户名肯定在你远程数据库B里已经存在,假设它为u2。

你现在要做的是,登录B库,grant select on tmenu to u2;
当然,你得有这个权限,比如是B库的SYSDBA,DBA,或者B库中tmenu表的拥有者。
mandarin 2010-01-27
  • 打赏
  • 举报
回复
ls的几位说下是赋dblink 的权限吗
suiziguo 2010-01-27
  • 打赏
  • 举报
回复
你肯定会说,我这不是存储过程/函数,匿名块也一样!
授权或添加细粒度控制语句吧。
liusong_china 2010-01-27
  • 打赏
  • 举报
回复
你单独执行 和 在过程中执行 的权限并不是完全相同的。
shiyiwan 2010-01-27
  • 打赏
  • 举报
回复
procedure的权限和用户的权限不完全相同的,即使这个prcedure是你建的

另外,dblink过来的objects在过程中这样写可能会有问题,通常我们的解决办法是建一个synonym
mandarin 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luocb1980 的回复:]
declare
  v_n number(10);
begin 
  select count(*) into v_n from tmenu@test;
  dbms_output.put_line(v_n);
end;

这样报错吗?
[/Quote]

这个报错 ,单独一句select * from tmenu@test是可以的。
luocb1980 2010-01-27
  • 打赏
  • 举报
回复
declare
v_n number(10);
begin
select count(*) into v_n from tmenu@test;
dbms_output.put_line(v_n);
end;

这样报错吗?
iqlife 2010-01-27
  • 打赏
  • 举报
回复
先用DBA权限查看你DBLINK的名称对的?
select owner,object_name from dba_objects where object_type='DATABASE LINK'
mandarin 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liusong_china 的回复:]
用户的权限问题吧。
[/Quote]
我同一个用户单独执行insert into tmenu(select * from tmenu@test);没有问题,应该不是权限的问题。
suiziguo 2010-01-27
  • 打赏
  • 举报
回复
存储过程需要单独授权,你当前用户对tmenu@test的访问权,应该来自角色里的权限,默认在过程中失效。

解决办法有二:
1 grant select on tmenu to username; --注意,这里的username是你db link登录远程数据库的用户。

2 存储过程/函数中加上Authid Current_User,使得用户可以在存储过程中使用其role权限。
liusong_china 2010-01-27
  • 打赏
  • 举报
回复
用户的权限问题吧。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧