触发器问题----在线等

lishan200012 2009-05-20 11:25:49
现状:oracle9i的表A,sqlserver2000的表B
我利用oracle的透明网关,建立的DBLINK(ORACLE->SQLSERVER)为"SQL";
在SQLPLUS中运行SELECT * FROM B@SQL的命令是可以运行.出现了我需要的数据结果.
问题:
我现在想通过ORACLE的A表的UPDATE中"B1"列名来修改SQLSERVER的B表中相对应"A1"列名的值.
其中A表的B2是对应B表中的A2
A表 B表
A1 A2 B1 B2
--- ---- ----- -------
0 ABC 0 ABC
1 BCD 1 BCD


我建了一个触发器.
create or replace trigger tr_Aupdate
after update on system.A for each row
begin
update B@sql set "B1"=:new.a1 where "B2"=:old.a2
end tr_Aupdate;
--------------------------
update system.A set A1=2 where A2="BCD";
select * from system.A where A2="BCD";
A1 A2 B1 B2
--- ---- ----- -------
2 BCD 1 BCD
SELECT * FROM B@SQL;
B1 B2
--- ----
0 ABC
1 BCD
在PLSQL中使用SELECT * FROM B@SQL提示ORA-02019:未找到远程数据库的连接说明.
我在往上也搜索了"ORA-02019"的信息及解决方法.但没有找到想要的结果和解决方法
请ORACLE高手指教小弟.将不胜感激.











...全文
241 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
vansoft 2012-02-27
  • 打赏
  • 举报
回复
怎么解决的啊?
lishan200012 2009-05-25
  • 打赏
  • 举报
回复
我已经解决了.
谢谢各位的回复
oraclelogan 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 lishan200012 的回复:]
引用 21 楼 superhsj 的回复:
如果连接到的用户有更新权限的话,应该是可以修改的吧。
至少oracle之间的dblink是这样。


SQL> update system.a set a1=2 where a2='bcd';
update system.a set a1=2 where a2='bcd'
*
ERROR 位于第 1 行:
ORA-04098: 触发器 'SYSTEM.TR_AUPDATE' 无效且未通过重新确认

没有认证是什么问题呢?
[/Quote]

好像是没有修改权限的意思?
lishan200012 2009-05-22
  • 打赏
  • 举报
回复
自己再顶一下
conghongbbs 2009-05-22
  • 打赏
  • 举报
回复
你的DBLINK是SQL吗?
lishan200012 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 superhsj 的回复:]
如果连接到的用户有更新权限的话,应该是可以修改的吧。
至少oracle之间的dblink是这样。
[/Quote]

SQL> update system.a set a1=2 where a2='bcd';
update system.a set a1=2 where a2='bcd'
*
ERROR 位于第 1 行:
ORA-04098: 触发器 'SYSTEM.TR_AUPDATE' 无效且未通过重新确认

没有认证是什么问题呢?
superhsj 2009-05-22
  • 打赏
  • 举报
回复
如果连接到的用户有更新权限的话,应该是可以修改的吧。
至少oracle之间的dblink是这样。
lishan200012 2009-05-22
  • 打赏
  • 举报
回复
请教高手们
ORACLE中触发器能修改SQLSERVER中表的数据吗?
前提是在SQLPLUS中能正常查看SQL的表数据.
inthirties 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lishan200012 的回复:]
引用 13 楼 wffffc 的回复:

触发器里面加个commit试试


加了COMMIT后
-------------------------------
SQL> update system.A set A1=2 where A2="BCD";
update system.A set A1=2 where A2="BCD"
              *
ERROR 位于第 1 行:
ORA-00604: 递归 SQL 层 1 出现错误
ORA-02067: 要求事务处理或保存点回退
[/Quote]

根据这个提示,你不能直接在这里以commit的形式提交,需要savepoint的形式提交或者回滚

savepoint a;

rollback to savepoint a或者commit to savepoint a;


==================================================================
Inthirties关注Oracle数据库 维护 优化,安全,备份,恢复,迁移,故障处理

如果你需要帮助或想和我一起学习的请联系
联系方式QQ:370140387
QQ群: 85837884(注明:数据库)
电子邮件:dba@Inthirties.com
网站: http://www.inthirties.com
lishan200012 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wffffc 的回复:]
触发器里面加个commit试试
[/Quote]

加了COMMIT后
-------------------------------
SQL> update system.A set A1=2 where A2="BCD";
update system.A set A1=2 where A2="BCD"
*
ERROR 位于第 1 行:
ORA-00604: 递归 SQL 层 1 出现错误
ORA-02067: 要求事务处理或保存点回退
wffffc 2009-05-21
  • 打赏
  • 举报
回复
触发器里面加个commit试试
lishan200012 2009-05-21
  • 打赏
  • 举报
回复
自己顶一下!
lishan200012 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xiaoxiao1984 的回复:]
检查创建的DBLINK(名字叫SQL的)是private 还是public的,如果是私有的,那么仅仅只有system帐号能够访问这个DBLINK;如果是公有的,那么所有帐户都能访问

(私下估计楼主创建trigger的用户不是system,且DBLINK是私有的)
trigger是用哪个帐号建立的?建立trigger帐号是否能够执行SELECT * FROM B@SQL; 如果不能,重建一个公有的DBLINK吧(楼主需要更新操作,所以只能重建一个public的,要不创建视图就行了) [/Quote]

DBLINK是在SQLPLUS,system的帐号建立的.
xiaoxiao1984 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wffffc 的回复:]
触发器里面加个commit试试
[/Quote]

触发器里面不能使用commit的,假设一个插入或更新的触发器使用了commit,那么我回滚了插入或更新操作,触发器里的动作已经提交了,不可能回滚了,这样事务的完整性就破坏了

如果非得在触发器里执行提交操作的话,只能用自治事务了

用system帐号建立的DBLINK,那么在PL/SQL里以system帐号登录,也是能够执行SELECT * FROM B@SQL; 能够正常看到查询结果

检查创建的DBLINK(名字叫SQL的)是private 还是public的,如果是私有的,那么仅仅只有system帐号能够访问这个DBLINK;如果是公有的,那么所有帐户都能访问

(私下估计楼主创建trigger的用户不是system,且DBLINK是私有的)
trigger是用哪个帐号建立的?建立trigger帐号是否能够执行SELECT * FROM B@SQL; 如果不能,重建一个公有的DBLINK吧(楼主需要更新操作,所以只能重建一个public的,要不创建视图就行了)

lishan200012 2009-05-21
  • 打赏
  • 举报
回复
现在又提示新的问题
SQL> update system.A set A1=2 where A2='BCD';
update system.A set A1=2 where A2='BCD'
*
ERROR 位于第 1 行:
ORA-04098: 触发器 'SYSTEM.TR_AUPDATE' 无效且未通过重新确认
mosaic 2009-05-20
  • 打赏
  • 举报
回复
楼主好像有两个问题是不是?

1. 触发器没用,因为B表的B1没有改为2
2. pl/sql developer里面不能执行SELECT * FROM B@SQL,而在sqlplus里面是可以的。


实际上还有问题:
update system.A set A1=2 where A2="BCD";
select * from system.A where A2="BCD";

这两个语句用了双引号都会报错吧? 还是只是发帖时的笔误而已?


第1个问题:
执行update system.A set A1=2 where A2='BCD'; 的时候有没有因为触发器的原因报错?

第2个问题:
如果dblink创建时没有指定为public,需要检查3楼说的问题。
另外不知道你的数据库是不是在本机上?
Adebayor 2009-05-20
  • 打赏
  • 举报
回复
帮顶
zjgcv 2009-05-20
  • 打赏
  • 举报
回复
在oracle上建@sql表的同义词吧,这样就不用每次都考虑表的owner的问题
zhouxu_hust 2009-05-20
  • 打赏
  • 举报
回复
学习
zhouxu_hust 2009-05-20
  • 打赏
  • 举报
回复
学习~
加载更多回复(6)

17,377

社区成员

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

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