首先大概说一下,我们的基础是两个不同的数据库,所以要做的第一步就是在数据库上建立dblink
1、查询是否有权限创建dblink,返回true即可,如果不行,百度查一下权限相关的事情
select * from v$option where PARAMETER='Advanced replication';
2、接下来就是创建dblink了
#创建dblink
mylink是链接名 testdb要连接的数据库 testdb_pwd密码 10.10.2.31:1521/ORCL_207为 ip:端口/实例名
create database link mylink connect to testdb identified by testdb_pwd using '10.10.2.31:1521/ORCL_207';
对应着修改成自己想要的就好,这里提醒大家一下,创建dblink根据你两个数据库是否在同一台服务器会有一些区别,我工作中做的是在同一台服务器上的,所以ip:端口/实例名对应的是下面这种模式,具体你的要自己注意一下
create database link mylink connect to testdb identified by testdb_pwd using
'(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.12.51)(PORT = 1410))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)';
3、查看创建好的dblink
select * from dba_db_links;
4、如何测试创建的dblink是否可用呢,可以直接通过dblink查询你另外一个库的表即可
表名@dblink名
select * from ask_table@mylink;
5、创建好dblink之后开始编写触发器,我下面提供一个触发器,提供的功能是一个基本的同步功能,即你在a表的新增,修改,删除操作都会同步
create or replace trigger syncAskTable #syncAskTable为触发器的名称
after insert or update or delete
on table_0902_test for each row #table_0902_test 为要同步的表
declare cunt integer:=0;
begin
case
when updating then
SELECT count(*) INTO cunt FROM table_0902_test@mylinkt WHERE t.tname=:old.tname;
IF cunt>0 THEN #当被同步的数据库存在该条数据记录,只做更新
update table_0902_test@mylinkt set t.tdeptname=:new.tdeptname, t.tage=:new.tage where t.tname=:old.tname;
END IF;
IF cunt<=0 THEN #当被同步的数据库不存在该条数据记录,将记录插入被同步的数据库的table_0902_test表。
INSERT INTO table_0902_test@mylink(tname,tdeptname,tage) VALUES (:new.tname,:new.tdeptname,:new.tage);
END IF;
when inserting then #新增
INSERT INTO table_0902_test@mylink(tname,tdeptname,tage) VALUES (:new.tname,:new.tdeptname,:new.tage);
when deleting then #删除
DELETE FROM table_0902_test@mylinkt WHERE t.tname=:old.tname;
end case;
end;
提供以下一些辅助性语句
查看新增的触发器
select * from user_triggers where trigger_name like '%SYNC%';
删除新增的触发器
drop trigger 触发器名
以上是我在工作中稍微处理的一个小问题,如果有不完善或者错误的地方感谢指出,轻喷