oracle两库触发器,两个oracle数据库间通过数据库链接和触发器同步两个数据库间数据...

两个oracle数据库间通过数据库链接和触发器同步两个数据库间数据

两个oracle数据库间通过数据库链接和触发器同步两个数据库间数据

为什么80%的码农都做不了架构师?>>>

9ecdd8d08791fe0d3074d2433a51e3bb.png

前提:本地数据库存在一张:A_TEST表,服务器数据库有两张表:A_TEST、A_TEST_HIST(历史表),需要将本地数据的更改、新增、删除同步到服务器数据库的两张表中。

方法一:通过触发器同步。

1、

用如下命令建立DB Link:

create database link MYTEST connect to XXXX identified by 'XXXX' using 'IP/Service Name(我的是:orcl)';

注意:需要DB支持Advanced replication功能,是否支持,可用如下SQL查看:

14155042_fRWv.gifselect * from v$option where PARAMETER='Advanced replication';

如果是返回True就表示支持。

2、建立触发器:sendToCeShiTest

create or replace trigger sendToCeShiTest

after insert or update or delete

on A_TEST

for each row

declare cunt integer:=0;

--PRAGMA AUTONOMOUS_TRANSACTION;  --自治事务解决触发器导致"ORA-04091:触发器/函数不能读它"不可行的验证

begin

case

when updating then

SELECT count(*) INTO cunt FROM A_TEST@MYTEST t WHERE t.A_TEST_ID=:old.A_TEST_ID;

IF cunt>0 THEN  --当服务器数据库存在该条数据记录,只做更新,同时将原数据记录到历史表。

INSERT INTO A_TEST_HIST@MYTEST  (A_TEST_ID,TEST_NAME,TEST_AGE,UPDATE_DATE) VALUES (:old.A_TEST_ID,:old.TEST_NAME,:old.TEST_AGE,SYSDATE);

update A_TEST@MYTEST t set t.TEST_AGE=:new.TEST_AGE, t.TEST_NAME=:new.TEST_NAME where t.A_TEST_ID=:old.A_TEST_ID;

END IF;

IF  cunt<=0 THEN  ---当服务器数据库不存在该条数据记录,将记录插入服务器数据库的A_TEST表。

INSERT INTO A_TEST@MYTEST  (A_TEST_ID,TEST_NAME,TEST_AGE) VALUES (:new.A_TEST_ID,:new.TEST_NAME,:new.TEST_AGE);

END IF;

when inserting then

INSERT INTO A_TEST@MYTEST  (A_TEST_ID,TEST_NAME,TEST_AGE) VALUES (:new.A_TEST_ID,:new.TEST_NAME,:new.TEST_AGE);

when deleting then

INSERT INTO [email protected] t (t.A_TEST_ID,t.TEST_NAME,t.TEST_AGE,t.UPDATE_DATE) VALUES (:old.A_TEST_ID,:old.TEST_NAME,:old.TEST_AGE,sysdate);

DELETE FROM [email protected]ST t WHERE  t.A_TEST_ID=:old.A_TEST_ID;

end case;

end;

3、测试

--UPDATE A_TEST SET TEST_NAME='小李' WHERE A_TEST_ID='1';

--INSERT INTO A_TEST  (A_TEST_ID,TEST_NAME,TEST_AGE) VALUES (2,'小陈',27);

--delete FROM A_TEST WHERE A_TEST_ID='1';

SELECT * FROM A_TEST;//查询本地库中的表A_TEST

SELECT * FROM [email protected];//查询服务器数据库中的表A_TEST

SELECT * FROM [email protected];//查询服务器数据库中的历史表A_TEST_HIST

4、结果

描述

Lnterval参数值

每天午夜12点

‘TRUNC(SYSDATE+1)’

每天早上8点30分

‘TRUNC(SYSDATE+1)+(8*60+30)/(24*60)’

每星期二中午12点

‘NEXT_DAY(TRUNC(SYSDATE),”TUESDAY”)+12/24′

每个月第一天的午夜12点

‘TRUNC(LAST_DAY(SYSDATE)+1)’

每个季度最后一天的晚上11点

‘TRUNC(ADD_MONTHS(SYSDATE+2/24,3),’Q')-1/24′

每星期六,日早上6点10分

‘TRUNC(LEAST(NEXT_DAY(SYSDATE,”SATURDAY”),

NEXT_DAY(SYSDATE,”SUNDAY”)))+(6*60+10)/(24*60)’

3、查询定时任务ID

SELECT * FROM DBA_JOBS;

SELECT * FROM USER_JOBS;

我这边查询定时任务ID=23;

4、手动执行定时任务。(注:如果设置的间隔较长可以采用手动运行测试)

BEGIN

dbms_job.run(23); --23为前面查询的定时任务ID

END;

5、移出定时任务

BEGIN

dbms_job.remove(23);  --23为前面查询的定时任务ID

END;

运行结果:

b3d90e958de9fcbc7616793fb78f97a3.png

数据已经由服务器上面的oracle数据库表同步过来了。

转载于:https://my.oschina.net/czpdjx/blog/1829750

两个oracle数据库间通过数据库链接和触发器同步两个数据库间数据相关教程

数据库中间件mycat分库分表

数据库中间件mycat分库分表 首先我们先通过一个案例来初步认识。 准备两个数据库服务 dhost1: 192.168.130.128:3306 dhost2: 192.168.130.129:3306 两个服务中均有testdb数据库,数据库中均有t_order表。 查看表结构: ?xml version=1.0?!DOCTYPE mycat:sch

shell 脚本获取MySQL数据库中所有表记录总数

shell 脚本获取MySQL数据库中所有表记录总数 近期遇到一个需求,Mysql数据库中需要统计所有表的记录数据: 查了下资料可以调取information_schema数据表中数据获取所有表记录数据,但是查询出来的数据,发现和手动统计的记录数据不一致,information_schema查

Oracle分组查询

Oracle分组查询 为什么80%的码农都做不了架构师? 分组查询,且只取每一组内的一条最新的记录 需求:查询 code 为a,b,c且在有效时间段内的每个code最新的一条记录(code不是主键) select * from (select code col1, col2, row_number() over (partition by

MyBatis 数据库逆向生成工具

MyBatis 数据库逆向生成工具 MyBatis 数据库逆向生成工具 介绍 !-- 通用mapper逆向工具 --dependencygroupIdtk.mybatis/groupIdartifactIdmapper-spring-boot-starter/artifactIdversion2.1.5/version/dependency ##########################################

Oracle数据库自学笔记

Oracle数据库自学笔记 创建账户,连接数据库 Oracle数据类型 修改表 修改表名,修改列名,添加列,修改列(数据类型,长度,默认值),删除列 修改表名 rename student to students 添加address-列 alter table students add address varchar2(2); 修改addres

Msyqldump和Xtrabackup全备与增量备份mysql数据库

Msyqldump和Xtrabackup全备与增量备份mysql数据库 Msyqldump和Xtrabackup全备与增量备份mysql数据库 1 、概述: 数据备份的介绍,类型,及 具; msyqldump 备份的实现和数据恢复;(4GB) Xtrabackup 备份的实现和数据恢复;( 百 G) 备份和恢复(数据): 2 、

02-线性结构1 两个有序链表序列的合并

02-线性结构1 两个有序链表序列的合并 #include stdio.h#include stdlib.htypedef int ElementType;typedef struct Node *PtrToNode;struct Node { ElementType Data; PtrToNode Next;};typedef PtrToNode List;List Read(); /* 细节在此不表 */void Print( L

数据库级别的MD5加密应用

数据库级别的MD5加密应用 数据库级别的MD5加密 MD5信息摘要算法 MD5算法因其普遍、稳定、快速的特点,仍广泛应用于普通数据的加密保护领域 -- =====================测试MD5加密=======================-- MD5信息摘要算法CREATE TABLE `testMD5 01`( `id` IN

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值