表同步更新的问题的触发器
生活随笔
收集整理的這篇文章主要介紹了
表同步更新的问题的触发器
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
??1sql?server?2000?觸發(fā)器,表同步更新的問(wèn)題?
??2有三個(gè)表,A?,B,C
??3A、B表中含有:?A1,B1,C1?三個(gè)字段,
??4C?表中存放A、B表中的A1、B1、C1?的集合,
??5字段類型都為nvarchar(10),
??6當(dāng)表A的數(shù)據(jù)被更新、刪除、插入后要反映到C表。
??7當(dāng)表B的數(shù)據(jù)被更新、刪除、插入后要反映到C表。
??8假定A,B表中在a1,b1,c1上有唯一索引
??9
?10
?11??????這個(gè)問(wèn)題如果純屬?gòu)睦碚搧?lái)說(shuō),是很容易解決的,因?yàn)閺囊罂芍?#xff0c;實(shí)質(zhì)上C表存放的數(shù)據(jù)即為A、B表的并集。可以在A、B表上創(chuàng)建相同的trigger,一旦A、B表上有變化,比如插入、刪除或更新時(shí),即清空C表數(shù)據(jù),然后把A、B表的數(shù)據(jù)union后插入C表中即可實(shí)現(xiàn)目的:)呵呵呵。。。
?12
?13??????下面的trigger的實(shí)現(xiàn)原理是:
?14
?15???????當(dāng)A表插入數(shù)據(jù)時(shí),檢查C表中是否有A表將要插入的數(shù)據(jù),如果無(wú),則將這行數(shù)據(jù)插入到C表中,反之,則不需要操作。
?16
?17???????當(dāng)A表update時(shí),?檢查B表中是否有更新前這行數(shù)據(jù),如果有,則C表中應(yīng)該保留這行數(shù)據(jù)且把A表中更新后的數(shù)據(jù)也插入到C表中去。如果B表中沒(méi)有A表更新前的這行數(shù)據(jù)且C表中沒(méi)有A表更新后的這行數(shù)據(jù),則需要用A表更新后的數(shù)據(jù)來(lái)更新C表中與A表更新前這行數(shù)據(jù)相同的數(shù)據(jù);如果B表中沒(méi)有A表更新的的這行數(shù)據(jù)且C表中有A表更新后的這行數(shù)據(jù),則需要從C表中刪除跟A表更新前相同的那行數(shù)據(jù)(因?yàn)楦翧表后,A表和B表都沒(méi)有A表更新前的那行數(shù)據(jù)了,則這行數(shù)據(jù)顯然在C表中不應(yīng)該再存在了)。
?18
?19???????當(dāng)A表中刪除時(shí),檢查B表是否還存在A表要?jiǎng)h除的這行數(shù)據(jù),如果有,則不能刪除C表中與A表要?jiǎng)h除的數(shù)據(jù)相同的行。反之,則執(zhí)行刪除操作。
?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表中是否已經(jīng)有A表中新插入的數(shù)據(jù)行,如果沒(méi)有,則也插入
?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表中更新前的這行數(shù)據(jù),如果有,則不需要更新C表中的數(shù)據(jù),而是要把A表中更新后的這行數(shù)據(jù)插入到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表更新后的這行數(shù)據(jù),則更新C表中跟A表更新前那行數(shù)據(jù)相同的數(shù)據(jù)
?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表更新后的這行數(shù)據(jù),則需要?jiǎng)h除C表中跟A表更新前相同的那行數(shù)據(jù)
?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表要?jiǎng)h除的這行數(shù)據(jù),則需要從C表中刪除這行數(shù)據(jù)
?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表中是否已經(jīng)有B表中新插入的數(shù)據(jù)行,如果沒(méi)有,則也插入
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表中更新前的這行數(shù)據(jù),如果有,則不需要更新C表中的數(shù)據(jù),而是要把A表中更新后的這行數(shù)據(jù)插入到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表更新后的這行數(shù)據(jù),則更新C表中跟b表更新前那行數(shù)據(jù)相同的數(shù)據(jù)
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表后的這行數(shù)據(jù),則需要?jiǎng)h除C表中跟B表更新前相同的那行數(shù)據(jù)
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表要?jiǎng)h除的這行數(shù)據(jù),則需要從C表中刪除這行數(shù)據(jù)
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_:?
??2有三個(gè)表,A?,B,C
??3A、B表中含有:?A1,B1,C1?三個(gè)字段,
??4C?表中存放A、B表中的A1、B1、C1?的集合,
??5字段類型都為nvarchar(10),
??6當(dāng)表A的數(shù)據(jù)被更新、刪除、插入后要反映到C表。
??7當(dāng)表B的數(shù)據(jù)被更新、刪除、插入后要反映到C表。
??8假定A,B表中在a1,b1,c1上有唯一索引
??9
?10
?11??????這個(gè)問(wèn)題如果純屬?gòu)睦碚搧?lái)說(shuō),是很容易解決的,因?yàn)閺囊罂芍?#xff0c;實(shí)質(zhì)上C表存放的數(shù)據(jù)即為A、B表的并集。可以在A、B表上創(chuàng)建相同的trigger,一旦A、B表上有變化,比如插入、刪除或更新時(shí),即清空C表數(shù)據(jù),然后把A、B表的數(shù)據(jù)union后插入C表中即可實(shí)現(xiàn)目的:)呵呵呵。。。
?12
?13??????下面的trigger的實(shí)現(xiàn)原理是:
?14
?15???????當(dāng)A表插入數(shù)據(jù)時(shí),檢查C表中是否有A表將要插入的數(shù)據(jù),如果無(wú),則將這行數(shù)據(jù)插入到C表中,反之,則不需要操作。
?16
?17???????當(dāng)A表update時(shí),?檢查B表中是否有更新前這行數(shù)據(jù),如果有,則C表中應(yīng)該保留這行數(shù)據(jù)且把A表中更新后的數(shù)據(jù)也插入到C表中去。如果B表中沒(méi)有A表更新前的這行數(shù)據(jù)且C表中沒(méi)有A表更新后的這行數(shù)據(jù),則需要用A表更新后的數(shù)據(jù)來(lái)更新C表中與A表更新前這行數(shù)據(jù)相同的數(shù)據(jù);如果B表中沒(méi)有A表更新的的這行數(shù)據(jù)且C表中有A表更新后的這行數(shù)據(jù),則需要從C表中刪除跟A表更新前相同的那行數(shù)據(jù)(因?yàn)楦翧表后,A表和B表都沒(méi)有A表更新前的那行數(shù)據(jù)了,則這行數(shù)據(jù)顯然在C表中不應(yīng)該再存在了)。
?18
?19???????當(dāng)A表中刪除時(shí),檢查B表是否還存在A表要?jiǎng)h除的這行數(shù)據(jù),如果有,則不能刪除C表中與A表要?jiǎng)h除的數(shù)據(jù)相同的行。反之,則執(zhí)行刪除操作。
?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表中是否已經(jīng)有A表中新插入的數(shù)據(jù)行,如果沒(méi)有,則也插入
?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表中更新前的這行數(shù)據(jù),如果有,則不需要更新C表中的數(shù)據(jù),而是要把A表中更新后的這行數(shù)據(jù)插入到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表更新后的這行數(shù)據(jù),則更新C表中跟A表更新前那行數(shù)據(jù)相同的數(shù)據(jù)
?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表更新后的這行數(shù)據(jù),則需要?jiǎng)h除C表中跟A表更新前相同的那行數(shù)據(jù)
?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表要?jiǎng)h除的這行數(shù)據(jù),則需要從C表中刪除這行數(shù)據(jù)
?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表中是否已經(jīng)有B表中新插入的數(shù)據(jù)行,如果沒(méi)有,則也插入
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表中更新前的這行數(shù)據(jù),如果有,則不需要更新C表中的數(shù)據(jù),而是要把A表中更新后的這行數(shù)據(jù)插入到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表更新后的這行數(shù)據(jù),則更新C表中跟b表更新前那行數(shù)據(jù)相同的數(shù)據(jù)
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表后的這行數(shù)據(jù),則需要?jiǎng)h除C表中跟B表更新前相同的那行數(shù)據(jù)
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表要?jiǎng)h除的這行數(shù)據(jù),則需要從C表中刪除這行數(shù)據(jù)
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_:?
轉(zhuǎn)載于:https://www.cnblogs.com/Dicky/archive/2005/05/21/160037.html
總結(jié)
以上是生活随笔為你收集整理的表同步更新的问题的触发器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中国工商银行的 Service Mesh
- 下一篇: 删除Windows 系统快捷方式箭头 D