首先创建一个 dblink(database link)
- create database link kings --dblink 的名字,同步的时候要用到这个名字,可以随便取
- connect to kings --连接到那个数据库的用户名
- identified by kings123 -- 连接那个数据库的密码
- using '(DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.75)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = XE)
- )
- )';
- -- 上边的 host 是连接数据库的 IP ,port 是端口号,要没改过的话就是 1521
有了 kings(dblink),我们就可以实现数据同步的工作了,通过触发器来实现
先说下场景,假如我们现在要做个同步的功能,在操作表as_emp的时候
1、添加:同样往 192.168.1.75 那个数据库里的empInfo添加一条记录(通过 empInfo@kings 表名@dblink 的方式访问)
2、更新:在更新as_emp.emp_code的时候,把这个字段的数据更新到empInfo.pass里去(当然你也可以做删除的操作...我这个业务里没这个需求)
- create or replace trigger syn_as_Emp
- after insert or update
- On as_emp
- for each row
- Begin
- case
- when inserting then
- insert into empInfo@kings(userid,pass) values(:new.emp_code,:new.emp_name);
- when updating then
- update empInfo@kings set pass=:new.emp_name where userid=:new.emp_code;
- end case;
- End;
后边我突然想到了个问题,创建dblink的代码应该要写到触发器里,先得确保有了触发器才能执行同步的操作呀,要不然数据库每次启动以后,连接就断了的!
我按照程序的思想想写个 try{创建dblink}catch()... 可怎么都写不了,突然看到有个地方说删除 dblink的命令是 drop database link dblink名字
我就觉得自己想太多了,用到 drop 的地方,就像表啊什么的,已经写到库里的,是肯定存在的,于是我尝试着重启数据库,果然,只要 dblink 没被删除,再数据库起来的时候 dblink 就存在了