如何在oracle中创建两个库之间的触发器

首先大概说一下,我们的基础是两个不同的数据库,所以要做的第一步就是在数据库上建立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 触发器名

以上是我在工作中稍微处理的一个小问题,如果有不完善或者错误的地方感谢指出,轻喷

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值