表同步更新的问题的触发器
2有三个表,A ,B,C
3A、B表中含有: A1,B1,C1 三个字段,
4C 表中存放A、B表中的A1、B1、C1 的集合,
5字段类型都为nvarchar(10),
6当表A的数据被更新、删除、插入后要反映到C表。
7当表B的数据被更新、删除、插入后要反映到C表。
8假定A,B表中在a1,b1,c1上有唯一索引
9
10
11 这个问题如果纯属从理论来说,是很容易解决的,因为从要求可知,实质上C表存放的数据即为A、B表的并集。可以在A、B表上创建相同的trigger,一旦A、B表上有变化,比如插入、删除或更新时,即清空C表数据,然后把A、B表的数据union后插入C表中即可实现目的:)呵呵呵。。。
12
13 下面的trigger的实现原理是:
14
15 当A表插入数据时,检查C表中是否有A表将要插入的数据,如果无,则将这行数据插入到C表中,反之,则不需要操作。
16
17 当A表update时, 检查B表中是否有更新前这行数据,如果有,则C表中应该保留这行数据且把A表中更新后的数据也插入到C表中去。如果B表中没有A表更新前的这行数据且C表中没有A表更新后的这行数据,则需要用A表更新后的数据来更新C表中与A表更新前这行数据相同的数据;如果B表中没有A表更新的的这行数据且C表中有A表更新后的这行数据,则需要从C表中删除跟A表更新前相同的那行数据(因为更新A表后,A表和B表都没有A表更新前的那行数据了,则这行数据显然在C表中不应该再存在了)。
18
19 当A表中删除时,检查B表是否还存在A表要删除的这行数据,如果有,则不能删除C表中与A表要删除的数据相同的行。反之,则执行删除操作。
20
21
22 B表中的trigger跟A表中的原理相同。
23
24
25CREATE TRIGGER SYNC_C_BY_A
26ON A
27AFTER INSERT,UPDATE,DELETE
28AS
29Declare @Dml TinyInt --1:Insert 2:Update 3:Delete
30Declare @RowsD Int
31Declare @RowsI Int
32Declare @A1_D nvarchar(10)
33Declare @B1_D Nvarchar(10)
34Declare @C1_D Nvarchar(10)
35--确定是哪一种dml操作
36Select @RowsD=Count(*) From Deleted
37Select @RowsI=Count(*) From Inserted
38If @RowsD=0 And @RowsI=0
39 Goto Exit_
40If @RowsD=0 And @RowsI>0
41 Set @Dml=1
42Else
43 If @RowsD>0 And @RowsI>0
44 Set @Dml=2
45 Else
46 If @RowsD>0 And @RowsI=0
47 Set @Dml=3
48IF @DML=1
49 BEGIN
50 --检查c表中是否已经有A表中新插入的数据行,如果没有,则也插入
51 IF NOT EXISTS(SELECT TOP 1 1 FROM c,inserted i where c.a1=i.a1 and c.b1=i.b1 and c.c1=i.c1)
52 insert into c select * from inserted
53 END
54IF @DML=2
55 BEGIN
56 --检查B表中是否有A表中更新前的这行数据,如果有,则不需要更新C表中的数据,而是要把A表中更新后的这行数据插入到C表中
57 IF NOT EXISTS(SELECT TOP 1 1 FROM B,DELETED d where b.a1=d.a1 and b.b1=d.b1 and b.c1=d.c1)
58 BEGIN
59 --如果C表中不存在A表更新后的这行数据,则更新C表中跟A表更新前那行数据相同的数据
60 IF NOT EXISTS(SELECT TOP 1 1 FROM C,INSERTED I WHERE C.A1=I.A1 AND C.B1=I.B1 AND C.C1=I.C1)
61 BEGIN
62 UPDATE C SET A1=I.A1,B1=I.B1,C1=I.C1 FROM C,INSERTED I,DELETED D WHERE C.A1=D.A1 AND C.B1=D.B1 AND C.C1=D.C1
63 END
64 --如果C表中存在A表更新后的这行数据,则需要删除C表中跟A表更新前相同的那行数据
65 ELSE
66 BEGIN
67 SELECT @A1_D=A1,@B1_D=B1,@C1_D=C1 FROM DELETED
68 DELETE FROM C WHERE @A1_D=A1 AND @B1_D=B1 AND @C1_D=C1
69 END
70 END
71 ELSE
72 insert into c select * from inserted i where not exists(select 1 from c where i.a1=c.a1 and i.b1=c.b1 and i.c1=c.c1)
73 END
74IF @DML=3
75 BEGIN
76 --如果B表中不存在A表要删除的这行数据,则需要从C表中删除这行数据
77 IF not exists(select top 1 1 from b,deleted d where b.a1=d.a1 and b.b1=d.b1 and b.c1=d.c1)
78 DELETE FROM C WHERE EXISTS(SELECT 1 FROM deleted d where c.a1=d.a1 and c.b1=d.b1 and c.c1=d.c1)
79 END
80EXIT_:
81
82CREATE TRIGGER SYNC_C_BY_B
83ON B
84AFTER INSERT,UPDATE,DELETE
85AS
86Declare @Dml TinyInt --1:Insert 2:Update 3:Delete
87Declare @RowsD Int
88Declare @RowsI Int
89Declare @A1_D nvarchar(10)
90Declare @B1_D Nvarchar(10)
91Declare @C1_D Nvarchar(10)
92--确定是哪一种dml操作
93Select @RowsD=Count(*) From Deleted
94Select @RowsI=Count(*) From Inserted
95If @RowsD=0 And @RowsI=0
96 Goto Exit_
97If @RowsD=0 And @RowsI>0
98 Set @Dml=1
99Else
100 If @RowsD>0 And @RowsI>0
101 Set @Dml=2
102 Else
103 If @RowsD>0 And @RowsI=0
104 Set @Dml=3
105IF @DML=1
106 BEGIN
107 --检查c表中是否已经有B表中新插入的数据行,如果没有,则也插入
108 IF NOT EXISTS(SELECT TOP 1 1 FROM c,inserted i where c.a1=i.a1 and c.b1=i.b1 and c.c1=i.c1)
109 insert into c select * from inserted
110 END
111IF @DML=2
112 BEGIN
113 --检查B表中是否有A表中更新前的这行数据,如果有,则不需要更新C表中的数据,而是要把A表中更新后的这行数据插入到C表中
114 IF NOT EXISTS(SELECT TOP 1 1 FROM A,DELETED d where a.a1=d.a1 and a.b1=d.b1 and a.c1=d.c1)
115 BEGIN
116 --如果C表中不存在B表更新后的这行数据,则更新C表中跟b表更新前那行数据相同的数据
117 IF NOT EXISTS(SELECT TOP 1 1 FROM C,INSERTED I WHERE C.A1=I.A1 AND C.B1=I.B1 AND C.C1=I.C1)
118 BEGIN
119 UPDATE C SET A1=I.A1,B1=I.B1,C1=I.C1 FROM C,INSERTED I,DELETED D WHERE C.A1=D.A1 AND C.B1=D.B1 AND C.C1=D.C1
120 END
121 --如果C表中存在更新B表后的这行数据,则需要删除C表中跟B表更新前相同的那行数据
122 ELSE
123 BEGIN
124 SELECT @A1_D=A1,@B1_D=B1,@C1_D=C1 FROM DELETED
125 DELETE FROM C WHERE @A1_D=A1 AND @B1_D=B1 AND @C1_D=C1
126 End
127
128 END
129 ELSE
130 insert into c select * from inserted i where not exists(select 1 from c where i.a1=c.a1 and i.b1=c.b1 and i.c1=c.c1)
131 END
132IF @DML=3
133 BEGIN
134 --如果A表中不存在B表要删除的这行数据,则需要从C表中删除这行数据
135 if not exists(select top 1 1 from a,deleted d where a.a1=d.a1 and a.b1=d.b1 and a.c1=d.c1)
136 DELETE FROM C WHERE EXISTS(SELECT 1 FROM deleted d where c.a1=d.a1 and c.b1=d.b1 and c.c1=d.c1)
137 END
138EXIT_:
转载于:https://www.cnblogs.com/Dicky/archive/2005/05/21/160037.html
表同步更新的问题的触发器相关推荐
- postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)
通过触发器方式获取表最后更新时间,并将时间信息写入到另外一张表 一.创建测试表和表记录更新时间表 CREATE TABLE weather( city varchar(80), temp_lo int ...
- Oracle12c与Oracle11g采用触发器与存储过程实现同步更新(代码+图解)
一.保证两台笔记本网络互通 关于连接,详情见之前写的:WIFI网络,两台笔记本互联Oracle,一台是11g,一台是12c 现在测试的ip地址: A: 10.65.252.84 B: 10.82.15 ...
- mysql 触发器 模板_MySQL 触发器例子(两张表同步增加和删除)
MySQL 触发器例子(两张表同步增加和删除),有需要的朋友可以参考下. 例子1: 创建两个表,目的是在一个表里添加一条记录,另一个表也添加一条记录: DROP TABLE IF EXISTS tab ...
- oracle 多表视图更新
1 前言 多表视图的定义:当视图的数据源只有一张数据表,则该视图为单表视图:当视图的数据源是多张数据表,则该视图为多表视图. 可更新视图的定义:在绝大多数人的概念中,视图是只读的,不允许修改.ORAC ...
- winform与数据库同步更新
很长时间没写了,不知道要写点什么,上篇中提到过会把游戏的寻路算法贴上,后来因为很长一段时间忙着其他的事情,还没来着及整理(最近就把他贴出来).既然这次的标题是数据库方面的,那就请我们回归正题吧. 在. ...
- 数据库表同步的三种方法
1.前言: 最近项目准备上线,要先做一下并行,所以要把调用接口的请求 请求到生产环境的同时也请求到并行环境.我刚开始,写了一个程序,多线程去生产数据库(接口有记录表,记录请求报文)取到请求报文,然后再 ...
- Oracle\MS SQL Server的数据库多表关联更新UPDATE与多表更新
一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表 一.MS S ...
- SQLite复杂表的更新方式
SQLite复杂表的更新方式 在SQLite中,如果早期设计的表无法满足需要,就需要对表进行更新,如修改名字.添加列.如果针对简单表,修改起来相对容易,直接使用提供的ALTER命令即可.但是如果该表与 ...
- mysql 同步更新_MySQL slave 不能同步更新
MySQL slave 不能同步更新 mysql slave server 上进程停止 重启后 不接收 master上的更新 mysql>show slave status\G; ***** ...
最新文章
- 用openCV去除文字中乱入的线条
- 【LeetCode】LC1408:一维数组的动态和
- Git本地分支和远程分支关联
- Eclipse 不为人所知的另一面 - 企业管理软件领域 ABAP 编程语言开发利器
- python中解决死锁的方法
- 第十七节、图像描述符匹配算法、以及目标匹配
- 卢伟冰直播拆机 或是性价比最高的骁龙855手机
- NLP判断语言情绪_网易严选nlp预训练语言模型的应用
- 区块链安全的奥秘之一:非对称加密
- tewa600agm是千兆吗_请问电信天翼网关光纤猫超级用户 型号tewa-600aem/tewa600agm
- 大田第一次和「 IDO 老徐 」连麦:诊断个人 IP
- Cannot start container web: iptables failed: iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 32797
- 漏洞库:爬取NVD-美国国家信息安全漏洞库
- 在传统软件公司十年深恶痛绝的感受
- PS怎么做抽象流彩油画丙烯画效果
- 吴恩达《机器学习》第四章:多元线性回归
- 外部磁盘_U盘识别与格式化问题_u盘格式化失败,导致无法识别/android格式化U盘失败
- 华为鲲鹏+银河麒麟v10 安装 docker-ce
- 终于放假咯~寒假规划
- noip2012 文化之旅 (深搜,最优性剪枝)