日期:2014-05-17  浏览次数:20939 次

触发器问题----在线等
现状: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高手指教小弟.将不胜感激.













------解决方案--------------------
引用楼主 lishan200012 的帖子:
在PLSQL中使用SELECT * FROM B@SQL提示ORA-02019:未找到远程数据库的连接说明.
我在往上也搜索了"ORA-02019"的信息及解决方法.但没有找到想要的结果和解决方法

------解决方案--------------------
学习~
------解决方案--------------------
在oracle上建@sql表的同义词吧,这样就不用每次都考虑表的owner的问题
------解决方案--------------------
帮顶
------解决方案--------------------
楼主好像有两个问题是不是?

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楼说的问题。
另外不知道你的数据库是不是在本机上?
------解决方案--------------------
探讨
引用楼主 lishan200012 的帖子:
现状: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
--- ---- …

------解决方案--------------------
触发器里面加个commit试试
------解决方案--------------------
探讨
引用:

触发器里面加个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: 要求事务处理或保存点回退

------解决方案--------------------
探讨
触发器里面加个commit试试

------解决方案--------------------
探讨
引用:
如果连接到的用户有更新权限的话,应该是可以修改的吧。
至少oracle之间的dblink是这样。


SQL> update system.a set a1=2 where a2='bcd';
update system.a set a1=2 where a2='bcd'