表同步更新的问题的触发器

  1 None.gif sql server  2000  触发器,表同步更新的问题 
  2 None.gif有三个表,A ,B,C
  3 None.gifA、B表中含有: A1,B1,C1 三个字段,
  4 None.gifC 表中存放A、B表中的A1、B1、C1 的集合,
  5 None.gif字段类型都为nvarchar( 10 ),
  6 None.gif当表A的数据被更新、删除、插入后要反映到C表。
  7 None.gif当表B的数据被更新、删除、插入后要反映到C表。
  8 None.gif假定A,B表中在a1,b1,c1上有唯一索引
  9 None.gif
 10 None.gif
 11 None.gif      这个问题如果纯属从理论来说,是很容易解决的,因为从要求可知,实质上C表存放的数据即为A、B表的并集。可以在A、B表上创建相同的trigger,一旦A、B表上有变化,比如插入、删除或更新时,即清空C表数据,然后把A、B表的数据union后插入C表中即可实现目的:)呵呵呵。。。
 12 None.gif
 13 None.gif      下面的trigger的实现原理是:
 14 None.gif
 15 None.gif       当A表插入数据时,检查C表中是否有A表将要插入的数据,如果无,则将这行数据插入到C表中,反之,则不需要操作。
 16 None.gif
 17 None.gif       当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 None.gif
 19 None.gif       当A表中删除时,检查B表是否还存在A表要删除的这行数据,如果有,则不能删除C表中与A表要删除的数据相同的行。反之,则执行删除操作。
 20 None.gif
 21 None.gif
 22 None.gif    B表中的trigger跟A表中的原理相同。
 23 None.gif
 24 None.gif
 25 None.gif CREATE   TRIGGER  SYNC_C_BY_A
 26 None.gif ON  A
 27 None.gifAFTER  INSERT , UPDATE , DELETE
 28 None.gif AS
 29 None.gif Declare   @Dml              TinyInt    -- 1:Insert 2:Update 3:Delete            
 30 None.gif Declare   @RowsD            Int             
 31 None.gif Declare   @RowsI            Int  
 32 None.gif Declare   @A1_D             nvarchar ( 10 )
 33 None.gif Declare   @B1_D             Nvarchar ( 10 )
 34 None.gif Declare   @C1_D             Nvarchar ( 10 )
 35 None.gif -- 确定是哪一种dml操作            
 36 None.gif Select   @RowsD = Count ( * From  Deleted            
 37 None.gif Select   @RowsI = Count ( * From  Inserted        
 38 None.gif If   @RowsD = 0   And   @RowsI = 0         
 39 None.gif     Goto  Exit_         
 40 None.gif If   @RowsD = 0   And   @RowsI > 0             
 41 None.gif     Set   @Dml = 1             
 42 None.gif Else             
 43 None.gif    If   @RowsD > 0   And   @RowsI > 0             
 44 None.gif        Set   @Dml = 2             
 45 None.gif    Else             
 46 None.gif        If   @RowsD > 0   And   @RowsI = 0             
 47 None.gif            Set   @Dml = 3  
 48 None.gif IF   @DML = 1
 49 None.gif    BEGIN
 50 None.gif        -- 检查c表中是否已经有A表中新插入的数据行,如果没有,则也插入
 51 None.gif         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 None.gif           insert   into  c  select   *   from  inserted
 53 None.gif    END
 54 None.gif IF   @DML = 2
 55 None.gif    BEGIN
 56 None.gif        -- 检查B表中是否有A表中更新前的这行数据,如果有,则不需要更新C表中的数据,而是要把A表中更新后的这行数据插入到C表中
 57 None.gif         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 None.gif          BEGIN             
 59 None.gif              -- 如果C表中不存在A表更新后的这行数据,则更新C表中跟A表更新前那行数据相同的数据
 60 None.gif               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 None.gif                  BEGIN
 62 None.gif                      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 None.gif                  END
 64 None.gif              -- 如果C表中存在A表更新后的这行数据,则需要删除C表中跟A表更新前相同的那行数据
 65 None.gif               ELSE
 66 None.gif                  BEGIN
 67 None.gif                      SELECT   @A1_D = A1, @B1_D = B1, @C1_D = C1  FROM  DELETED
 68 None.gif                      DELETE   FROM  C  WHERE   @A1_D = A1  AND   @B1_D = B1  AND   @C1_D = C1
 69 None.gif                  END
 70 None.gif          END
 71 None.gif        ELSE
 72 None.gif           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 None.gif    END
 74 None.gif IF   @DML = 3
 75 None.gif    BEGIN
 76 None.gif        -- 如果B表中不存在A表要删除的这行数据,则需要从C表中删除这行数据
 77 None.gif         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 None.gif        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 None.gif    END
 80 None.gifEXIT_:  
 81 None.gif
 82 None.gif CREATE   TRIGGER  SYNC_C_BY_B 
 83 None.gif ON  B
 84 None.gifAFTER  INSERT , UPDATE , DELETE
 85 None.gif AS
 86 None.gif Declare   @Dml              TinyInt    -- 1:Insert 2:Update 3:Delete            
 87 None.gif Declare   @RowsD            Int             
 88 None.gif Declare   @RowsI            Int  
 89 None.gif Declare   @A1_D             nvarchar ( 10 )
 90 None.gif Declare   @B1_D             Nvarchar ( 10 )
 91 None.gif Declare   @C1_D             Nvarchar ( 10 )
 92 None.gif -- 确定是哪一种dml操作            
 93 None.gif Select   @RowsD = Count ( * From  Deleted            
 94 None.gif Select   @RowsI = Count ( * From  Inserted        
 95 None.gif If   @RowsD = 0   And   @RowsI = 0         
 96 None.gif     Goto  Exit_         
 97 None.gif If   @RowsD = 0   And   @RowsI > 0             
 98 None.gif     Set   @Dml = 1             
 99 None.gif Else             
100 None.gif    If   @RowsD > 0   And   @RowsI > 0             
101 None.gif        Set   @Dml = 2             
102 None.gif    Else             
103 None.gif        If   @RowsD > 0   And   @RowsI = 0             
104 None.gif            Set   @Dml = 3  
105 None.gif IF   @DML = 1
106 None.gif    BEGIN
107 None.gif        -- 检查c表中是否已经有B表中新插入的数据行,如果没有,则也插入
108 None.gif         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 None.gif           insert   into  c  select   *   from  inserted
110 None.gif    END
111 None.gif IF   @DML = 2
112 None.gif    BEGIN
113 None.gif        -- 检查B表中是否有A表中更新前的这行数据,如果有,则不需要更新C表中的数据,而是要把A表中更新后的这行数据插入到C表中
114 None.gif         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 None.gif          BEGIN            
116 None.gif              -- 如果C表中不存在B表更新后的这行数据,则更新C表中跟b表更新前那行数据相同的数据
117 None.gif              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 None.gif                 BEGIN
119 None.gif                     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 None.gif                 END
121 None.gif              -- 如果C表中存在更新B表后的这行数据,则需要删除C表中跟B表更新前相同的那行数据
122 None.gif              ELSE
123 None.gif                 BEGIN
124 None.gif                     SELECT   @A1_D = A1, @B1_D = B1, @C1_D = C1  FROM  DELETED
125 None.gif                     DELETE   FROM  C  WHERE   @A1_D = A1  AND   @B1_D = B1  AND   @C1_D = C1
126 None.gif                 End
127 None.gif                   
128 None.gif          END
129 None.gif        ELSE
130 None.gif           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 None.gif    END
132 None.gif IF   @DML = 3
133 None.gif    BEGIN
134 None.gif        -- 如果A表中不存在B表要删除的这行数据,则需要从C表中删除这行数据
135 None.gif         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 None.gif        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 None.gif    END
138 None.gifEXIT_: 

转载于:https://www.cnblogs.com/Dicky/archive/2005/05/21/160037.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值