Oracle两张数据表之间某个指定字段的单向和双向同步

2024-04-26 01:32

本文主要是介绍Oracle两张数据表之间某个指定字段的单向和双向同步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、单向同步:

大致介绍:ceshione这张表中的AA字段发生改变,ceshitwo这张表中如果存关联id则CC字段改成相同的值;而ceshitwo这张表中的CC字段发生改变,就算ceshione这张表中存在关联id,AA字段也不发生改变!

用途:主要用于主表与从表之间,以主表为准的情况!

实现代码如下:

1.ceshione表:

CREATE TABLE "MZD"."CESHIONE" (
"AA" VARCHAR2(255 BYTE) NULL ,
"BB" VARCHAR2(255 BYTE) NULL ,
"ID" NUMBER NULL 
)

2.ceshitwo表:

CREATE TABLE "MZD"."CESHITWO" (
"CC" VARCHAR2(255 BYTE) NULL ,
"DD" VARCHAR2(255 BYTE) NULL ,
"ID" NUMBER NULL 
)

3.单向同步脚本:

create or replace trigger tongbuafter insert or update or deleteon CESHIONEreferencing old as old_valuenew as new_valuefor each row
beginif inserting thenupdate CESHITWO set CC = :new_value.AAwhere id = :new_value.id;elsif updating thenupdate CESHITWO set CC = :new_value.AAwhere id = :new_value.id;end if;
end;

2、双向同步:

大致介绍:ceshione这张表中的AA字段发生改变,ceshitwo这张表中如果存关联id则CC字段改成相同的值;相同,ceshitwo这张表中的CC字段发生改变,ceshione这张表中如果存关联id则AA字段改成相同的值。

用途:主要用于两张级别相同的表中,还有一种可能是,设计数据库的时候没有设计好,出现相同的字段在不同的表中出现不同的值!!!

是不是会有脑洞大开的人-再写一个触发器,让ceshitwo中的CC发生改变的时候ceshione中的AA也发生改变

然后就变成这样:

这里写图片描述

这里写图片描述

正确的实现方案:

两张表上分别建立触发器进行同步,但是这样操作会有个问题,就会导致触发器循环触发。那么就需要在触发器进行触发前,进行一个判断,如果操作是由触发器引发的,那么就不做操作,反之,执行触发器定义的操作。想要实现这个,我开始考虑过在触发器a里面暂时使触发器b失效,但是发现alter trigger disable不合法;然后看到有人提到在表里面新增一个字段,用来做标识,但是这样需要修改表结构,虽然可以达到要求,但是总觉得不是很好,所以也没有使用;后来通过学习oracle对象,了解到了包的特性,所以决定采用包的方式来实现,利用包的变量来做标识。

参考网址:

https://www.thinksaas.cn/group/topic/468345/

代码实现:

1.ceshione表:

CREATE TABLE "MZD"."CESHIONE" (
"AA" VARCHAR2(255 BYTE) NULL ,
"BB" VARCHAR2(255 BYTE) NULL ,
"ID" NUMBER NULL 
)

2.ceshitwo表:

CREATE TABLE "MZD"."CESHITWO" (
"CC" VARCHAR2(255 BYTE) NULL ,
"DD" VARCHAR2(255 BYTE) NULL ,
"ID" NUMBER NULL 
)

3.双向同步脚本:

(1)这部分不需要改—作为一只菜鸟,没看的太明白0.0

--创建包头
create or replace package pk_check_active is --标识是否为触发器引发n number :=0;--获取是否为触发器触发标识,1为触发器触发function getactive return number;--设置状态procedure setactive(n1 in number);
end pk_check_active;create or replace package body pk_check_active asfunction getactive return number isbeginreturn n;end getactive;procedure setactive(n1 in number) isbeginn := n1;end setactive;
end pk_check_active;

(2)触发表CESHIONE:

create or replace trigger tr_cs_user after insert or update
on CESHIONE for each row
beginif pk_check_active.getactive() =1 thenpk_check_active.setactive(2);  return;elsepk_check_active.setactive(1);end if;
if inserting thenupdate CESHITWO  set CESHITWO.CC=:new.AA WHERE CESHITWO.ID=:NEW.ID;
elsif updating then update CESHITWO  set CESHITWO.CC=:new.AA WHERE CESHITWO.ID=:NEW.ID;
end if;pk_check_active.setactive(0);
end;

(3)触发表CESHITWO:

create or replace trigger tr_bs_user after insert or update
on CESHITWO for each row   
beginif pk_check_active.getactive() =1 thenpk_check_active.setactive(2); return;elsepk_check_active.setactive(1);end if;
if inserting thenupdate CESHIONE  set CESHIONE.AA=:new.CC where CESHIONE.ID=:NEW.ID;
elsif updating then update CESHIONE  set CESHIONE.AA=:new.CC where CESHIONE.ID=:NEW.ID;
end if;pk_check_active.setactive(0);
end;

这篇关于Oracle两张数据表之间某个指定字段的单向和双向同步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936347

相关文章

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

mybatis-plus如何根据任意字段saveOrUpdateBatch

《mybatis-plus如何根据任意字段saveOrUpdateBatch》MyBatisPlussaveOrUpdateBatch默认按主键判断操作类型,若需按其他唯一字段(如agentId、pe... 目录使用场景方法源码方法改造首先在service层定义接口service层接口实现总结使用场景my

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

java -jar example.jar 产生的日志输出到指定文件的方法

《java-jarexample.jar产生的日志输出到指定文件的方法》这篇文章给大家介绍java-jarexample.jar产生的日志输出到指定文件的方法,本文给大家介绍的非常详细,对大家的... 目录怎么让 Java -jar example.jar 产生的日志输出到指定文件一、方法1:使用重定向1、

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理