1表同步更新的问题的触发器sql server 2000 触发器,表同步更新的问题 
  2表同步更新的问题的触发器有三个表,A ,B,C
  3表同步更新的问题的触发器A、B表中含有: A1,B1,C1 三个字段,
  4表同步更新的问题的触发器C 表中存放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表同步更新的问题的触发器
 25表同步更新的问题的触发器CREATE TRIGGER SYNC_C_BY_A
 26表同步更新的问题的触发器ON A
 27表同步更新的问题的触发器AFTER INSERT,UPDATE,DELETE
 28表同步更新的问题的触发器AS
 29表同步更新的问题的触发器Declare @Dml            TinyInt  --1:Insert 2:Update 3:Delete            
 30表同步更新的问题的触发器Declare @RowsD          Int            
 31表同步更新的问题的触发器Declare @RowsI          Int 
 32表同步更新的问题的触发器Declare @A1_D           nvarchar(10)
 33表同步更新的问题的触发器Declare @B1_D           Nvarchar(10)
 34表同步更新的问题的触发器Declare @C1_D           Nvarchar(10)
 35表同步更新的问题的触发器--确定是哪一种dml操作            
 36表同步更新的问题的触发器Select @RowsD=Count(*From Deleted            
 37表同步更新的问题的触发器Select @RowsI=Count(*From Inserted        
 38表同步更新的问题的触发器If @RowsD=0 And @RowsI=0        
 39表同步更新的问题的触发器    Goto Exit_         
 40表同步更新的问题的触发器If @RowsD=0 And @RowsI>0            
 41表同步更新的问题的触发器    Set @Dml=1            
 42表同步更新的问题的触发器Else            
 43表同步更新的问题的触发器   If @RowsD>0 And @RowsI>0            
 44表同步更新的问题的触发器       Set @Dml=2            
 45表同步更新的问题的触发器   Else            
 46表同步更新的问题的触发器       If @RowsD>0 And @RowsI=0            
 47表同步更新的问题的触发器           Set @Dml=3 
 48表同步更新的问题的触发器IF @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
 54表同步更新的问题的触发器IF @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
 74表同步更新的问题的触发器IF @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
 80表同步更新的问题的触发器EXIT_:  
 81表同步更新的问题的触发器
 82表同步更新的问题的触发器CREATE TRIGGER SYNC_C_BY_B 
 83表同步更新的问题的触发器ON B
 84表同步更新的问题的触发器AFTER INSERT,UPDATE,DELETE
 85表同步更新的问题的触发器AS
 86表同步更新的问题的触发器Declare @Dml            TinyInt  --1:Insert 2:Update 3:Delete            
 87表同步更新的问题的触发器Declare @RowsD          Int            
 88表同步更新的问题的触发器Declare @RowsI          Int 
 89表同步更新的问题的触发器Declare @A1_D           nvarchar(10)
 90表同步更新的问题的触发器Declare @B1_D           Nvarchar(10)
 91表同步更新的问题的触发器Declare @C1_D           Nvarchar(10)
 92表同步更新的问题的触发器--确定是哪一种dml操作            
 93表同步更新的问题的触发器Select @RowsD=Count(*From Deleted            
 94表同步更新的问题的触发器Select @RowsI=Count(*From Inserted        
 95表同步更新的问题的触发器If @RowsD=0 And @RowsI=0        
 96表同步更新的问题的触发器    Goto Exit_         
 97表同步更新的问题的触发器If @RowsD=0 And @RowsI>0            
 98表同步更新的问题的触发器    Set @Dml=1            
 99表同步更新的问题的触发器Else            
100表同步更新的问题的触发器   If @RowsD>0 And @RowsI>0            
101表同步更新的问题的触发器       Set @Dml=2            
102表同步更新的问题的触发器   Else            
103表同步更新的问题的触发器       If @RowsD>0 And @RowsI=0            
104表同步更新的问题的触发器           Set @Dml=3 
105表同步更新的问题的触发器IF @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
111表同步更新的问题的触发器IF @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
132表同步更新的问题的触发器IF @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
138表同步更新的问题的触发器EXIT_: 

相关文章: