亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

表同步更新的問題的觸發器(SQLSERVER)

2024-07-21 02:44:41
字體:
來源:轉載
供稿:網友

sql server 2000 觸發器,表同步更新的問題
  有三個表,A ,B,C
  A、B表中含有: A1,B1,C1 三個字段,
  C 表中存放A、B表中的A1、B1、C1 的集合,
  字段類型都為nvarchar(10),
  當表A的數據被更新、刪除、插入后要反映到C表。
  當表B的數據被更新、刪除、插入后要反映到C表。
  假定A,B表中在a1,b1,c1上有唯一索引

  這個問題如果純屬從理論來說,是很容易解決的,因為從要求可知,實質上C表存放的數據即為A、B表的并集??梢栽贏、B表上創建相同的trigger,一旦A、B表上有變化,比如插入、刪除或更新時,即清空C表數據,然后把A、B表的數據union后插入C表中即可實現目的:)呵呵呵。。。

  下面的trigger的實現原理是:

  當A表插入數據時,檢查C表中是否有A表將要插入的數據,如果無,則將這行數據插入到C表中,反之,則不需要操作。

  當A表update時, 檢查B表中是否有更新前這行數據,如果有,則C表中應該保留這行數據且把A表中更新后的數據也插入到C表中去。如果B表中沒有A表更新前的這行數據且C表中沒有A表更新后的這行數據,則需要用A表更新后的數據來更新C表中與A表更新前這行數據相同的數據;如果B表中沒有A表更新的的這行數據且C表中有A表更新后的這行數據,則需要從C表中刪除跟A表更新前相同的那行數據(因為更新A表后,A表和B表都沒有A表更新前的那行數據了,則這行數據顯然在C表中不應該再存在了)。

  當A表中刪除時,檢查B表是否還存在A表要刪除的這行數據,如果有,則不能刪除C表中與A表要刪除的數據相同的行。反之,則執行刪除操作。

  B表中的trigger跟A表中的原理相同。

  CREATE TRIGGER SYNC_C_BY_A
  ON A
  AFTER INSERT,UPDATE,DELETE
  AS
  Declare @DmlTinyInt  --1:Insert 2:Update 3:Delete
  Declare @RowsD    Int
  Declare @RowsI    Int
  Declare @A1_D     nvarchar(10)
  Declare @B1_D     Nvarchar(10)
  Declare @C1_D     Nvarchar(10)
  --確定是哪一種dml操作
  Select @RowsD=Count(*) From Deleted
  Select @RowsI=Count(*) From Inserted 
  If @RowsD=0 And @RowsI=0 
      Goto Exit_  
  If @RowsD=0 And @RowsI>0
      Set @Dml=1
  Else
     If @RowsD>0 And @RowsI>0
   Set @Dml=2
     Else
   If @RowsD>0 And @RowsI=0
       Set @Dml=3
  IF @DML=1
     BEGIN
   --檢查c表中是否已經有A表中新插入的數據行,如果沒有,則也插入
   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)
      insert into c select * from inserted
     END
  IF @DML=2
     BEGIN
   --檢查B表中是否有A表中更新前的這行數據,如果有,則不需要更新C表中的數據,而是要把A表中更新后的這行數據插入到C表中
   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)
     BEGIN
   --如果C表中不存在A表更新后的這行數據,則更新C表中跟A表更新前那行數據相同的數據
   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)
       BEGIN
     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
       END
   --如果C表中存在A表更新后的這行數據,則需要刪除C表中跟A表更新前相同的那行數據
   ELSE
       BEGIN
     SELECT @A1_D=A1,@B1_D=B1,@C1_D=C1 FROM DELETED
     DELETE FROM C WHERE @A1_D=A1 AND @B1_D=B1 AND @C1_D=C1
       END
     END
   ELSE
      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)
     END
  IF @DML=3
     BEGIN
   --如果B表中不存在A表要刪除的這行數據,則需要從C表中刪除這行數據
   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)
   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)
     END
  EXIT_: 

  CREATE TRIGGER SYNC_C_BY_B
  ON B
  AFTER INSERT,UPDATE,DELETE
  AS
  Declare @DmlTinyInt  --1:Insert 2:Update 3:Delete
  Declare @RowsD    Int
  Declare @RowsI    Int
  Declare @A1_D     nvarchar(10)
  Declare @B1_D     Nvarchar(10)
  Declare @C1_D     Nvarchar(10)
  --確定是哪一種dml操作
  Select @RowsD=Count(*) From Deleted
  Select @RowsI=Count(*) From Inserted 
  If @RowsD=0 And @RowsI=0 
      Goto Exit_  
  If @RowsD=0 And @RowsI>0
      Set @Dml=1
  Else
     If @RowsD>0 And @RowsI>0
   Set @Dml=2
     Else
   If @RowsD>0 And @RowsI=0
       Set @Dml=3
  IF @DML=1
     BEGIN
   --檢查c表中是否已經有B表中新插入的數據行,如果沒有,則也插入
   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)
      insert into c select * from inserted
     END
  IF @DML=2
     BEGIN
   --檢查B表中是否有A表中更新前的這行數據,如果有,則不需要更新C表中的數據,而是要把A表中更新后的這行數據插入到C表中
   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)
     BEGIN    
   --如果C表中不存在B表更新后的這行數據,則更新C表中跟b表更新前那行數據相同的數據
  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)
      BEGIN
    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
      END
   --如果C表中存在更新B表后的這行數據,則需要刪除C表中跟B表更新前相同的那行數據
  ELSE
      BEGIN
    SELECT @A1_D=A1,@B1_D=B1,@C1_D=C1 FROM DELETED
    DELETE FROM C WHERE @A1_D=A1 AND @B1_D=B1 AND @C1_D=C1
      End
  
     END
   ELSE
      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)
     END
  IF @DML=3
     BEGIN
   --如果A表中不存在B表要刪除的這行數據,則需要從C表中刪除這行數據
   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)
   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)
     END
  EXIT_:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品一二区| 亚洲午夜未满十八勿入免费观看全集| 欧美极品少妇xxxxⅹ免费视频| 国产精品成人va在线观看| 日韩电影免费观看中文字幕| 97久久精品在线| 精品国产一区二区三区久久狼5月| 2019中文字幕免费视频| 欧美特黄级在线| 91av在线精品| 久久久久久亚洲精品中文字幕| 国内精品久久久久久久久| 亚洲人精品午夜在线观看| 欧美日韩精品中文字幕| 韩国视频理论视频久久| 中文字幕一区二区三区电影| 91精品国产高清久久久久久| 自拍偷拍免费精品| 欧美性猛交丰臀xxxxx网站| 成人激情电影一区二区| 亚洲欧洲一区二区三区在线观看| 中国日韩欧美久久久久久久久| 欧美主播福利视频| 久久精品久久久久久| 久久精品久久久久久国产 免费| 中文字幕一精品亚洲无线一区| 国产精品h片在线播放| 日韩精品在线视频观看| 日韩av大片免费看| 按摩亚洲人久久| 欧美成人午夜激情视频| 欧美性69xxxx肥| 欧美日韩国产在线| 中文字幕日韩av电影| 91精品国产高清久久久久久久久| 国产精品亚洲自拍| 91精品视频在线播放| 国产综合在线看| 国产精品扒开腿做爽爽爽视频| 欧洲亚洲免费视频| 俺去亚洲欧洲欧美日韩| 91高清视频免费| 国产精品无av码在线观看| 欧美福利视频在线观看| 亚洲视频在线观看网站| 爱福利视频一区| 日韩精品极品在线观看| 久久99精品视频一区97| 亚洲精品在线不卡| 最近免费中文字幕视频2019| 国产日韩在线看片| 欧美一级视频免费在线观看| 欧美性黄网官网| 欧美高跟鞋交xxxxhd| 欧美肥臀大乳一区二区免费视频| 久久久久久综合网天天| 高清视频欧美一级| 成人精品视频在线| 午夜精品三级视频福利| 国产欧美韩国高清| 成人h片在线播放免费网站| 欧美日韩国产激情| 国产精品永久免费在线| 最近中文字幕2019免费| 久久亚洲春色中文字幕| 91国语精品自产拍在线观看性色| 国产成人精品网站| 亚洲精品黄网在线观看| 亚洲激情 国产| 久久香蕉频线观| 国产精品精品久久久| 精品一区二区电影| 在线观看欧美视频| 欧美最猛性xxxxx亚洲精品| 一本大道香蕉久在线播放29| 欧美床上激情在线观看| 欧美国产日产韩国视频| 另类专区欧美制服同性| 性亚洲最疯狂xxxx高清| 97精品国产aⅴ7777| 欧美性猛交视频| 精品视频久久久| 国产成人av在线播放| 日韩精品免费视频| 日韩欧美综合在线视频| 亚洲精品一区二区在线| 高清日韩电视剧大全免费播放在线观看| 国产91精品高潮白浆喷水| 夜夜嗨av一区二区三区免费区| 久久在线视频在线| 日韩精品视频在线播放| 日韩欧美aaa| 国产在线视频91| 亚洲午夜久久久影院| 国产精品视频网址| 永久免费毛片在线播放不卡| 中文字幕精品国产| 亚洲综合社区网| www.欧美视频| 亚洲人午夜精品| 91精品综合久久久久久五月天| 色老头一区二区三区| 91免费精品国偷自产在线| 性欧美xxxx视频在线观看| 日本久久久久久久久| 欧美亚洲国产另类| 亚洲第一精品久久忘忧草社区| 三级精品视频久久久久| 精品国内产的精品视频在线观看| 国产精品国产三级国产aⅴ浪潮| 欧美性极品xxxx做受| 影音先锋欧美在线资源| 日韩精品在线视频| 久久影院中文字幕| 日韩av片永久免费网站| 色无极亚洲影院| 日韩电视剧免费观看网站| 色噜噜狠狠狠综合曰曰曰88av| 亚洲精品美女在线观看播放| 亚洲韩国欧洲国产日产av| 欧美激情在线观看| 欧美黑人又粗大| 中文字幕日韩欧美精品在线观看| 亚洲国产精品视频在线观看| 亚洲欧美国产一本综合首页| 午夜美女久久久久爽久久| 久久久久久综合网天天| 日韩av中文字幕在线免费观看| 亚洲成人免费网站| 精品久久久久久中文字幕| 国产日韩在线一区| 国产精品免费视频xxxx| 亚洲理论电影网| 日韩中文在线观看| 91久久精品国产91久久| 中文字幕日韩综合av| 欧美电影免费观看| 日本久久久久久久久久久| 久久久久久久av| 久久久久久久久电影| 亚洲黄色免费三级| 国产精品777| 日韩亚洲精品视频| 亚洲黄色av网站| 亚洲第一网站男人都懂| 欧美亚洲另类激情另类| 亚洲欧美精品伊人久久| 一级做a爰片久久毛片美女图片| 国产精品欧美亚洲777777| 91久久精品在线| 国产91成人video| 91免费版网站入口| 91精品久久久久久久久久另类| 国产欧美日韩精品在线观看| 欧美在线视频网| 中国china体内裑精亚洲片| 高清日韩电视剧大全免费播放在线观看| 中文字幕精品国产| 深夜福利亚洲导航| 久久夜色精品国产亚洲aⅴ| 久久国产精品久久久久久| 国产亚洲欧美日韩精品| 欧美另类69精品久久久久9999| 性欧美xxxx视频在线观看|