两张表A,B
结构完全一样,初始数据也完全一样
做一个触发器,使得更新A的同时,也更新B,我写的触发器是这样的
(假设A所有字段为:ID,t1,t2,t3,……,t9)
create trigger tr_A_update
on A
for update
as
delete B where exists(select * FROM deleted where B.ID =deleted.ID )
insert into B (ID,t1,t2,t3,t4,t5,t6,t7,t8,t9)
select ID,t1,t2,t3,t4,t5,t6,t7,t8,t9
from inserted
但这里存在一个问题,就是,若B有改动之后,对A进行UPDATE操作,触发器会把B改动之后的数据覆盖掉。
打个比方,初始状态的时候,A和B中的数据都是(0,1,2,3,4,5,6,7,8,9),首先我对B进行UPDATE,把B变成了(0,1,1,1,1,5,6,7,8,9),接着,我又对A进行UPDATE,把A变成了(0,1,2,3,4,1,1,1,1,1),本来是希望触发器把B变成(0,1,1,1,1,1,1,1,1,1)的,但是现在触发器把B变成了(0,1,2,3,4,1,1,1,1,1),不是原来所想,请问怎么做这个触发器呢?
结构完全一样,初始数据也完全一样
做一个触发器,使得更新A的同时,也更新B,我写的触发器是这样的
(假设A所有字段为:ID,t1,t2,t3,……,t9)
create trigger tr_A_update
on A
for update
as
delete B where exists(select * FROM deleted where B.ID =deleted.ID )
insert into B (ID,t1,t2,t3,t4,t5,t6,t7,t8,t9)
select ID,t1,t2,t3,t4,t5,t6,t7,t8,t9
from inserted
但这里存在一个问题,就是,若B有改动之后,对A进行UPDATE操作,触发器会把B改动之后的数据覆盖掉。
打个比方,初始状态的时候,A和B中的数据都是(0,1,2,3,4,5,6,7,8,9),首先我对B进行UPDATE,把B变成了(0,1,1,1,1,5,6,7,8,9),接着,我又对A进行UPDATE,把A变成了(0,1,2,3,4,1,1,1,1,1),本来是希望触发器把B变成(0,1,1,1,1,1,1,1,1,1)的,但是现在触发器把B变成了(0,1,2,3,4,1,1,1,1,1),不是原来所想,请问怎么做这个触发器呢?
也就是说create trigger tr_A_update
on A
for update
as
if update(t1)
begin
update B set B.t1=i.t1
from inserted as i join deleted as d on (i.ID=d.id)
where B.ID=d.id and
end……这是我更改后的触发器,但是如果有9个字段的话,那么就要写9次上面的begin……end语句块,我嫌麻烦,请问有简洁一点的方法吗?
ID,t1,t2,t3,……,t9
十个字段
主键是ID
你的触发器的意思本来就是这样啊
--------------
第二次已经将t1,t2,t3,t4改成1了。怎么后面又改回去了。
改回去了。当然B表也需要跟着改了。。
on A
for update
as
delete B where exists(select * FROM deleted where B.ID =deleted.ID )
insert into B (ID,t1,t2,t3,t4,t5,t6,t7,t8,t9)
select ID,t1,t2,t3,t4,t5,t6,t7,t8,t9
from inserted
你原先的这个语句有什么问题?
因为A中还是(0,1,2,3,4,5,6,7,8,9),对A的操作是只UPDATE后5个
如果B更改过了,但是,A更新了的话,会覆盖B更改过的值,这是不希望见到的
那你这个地方有没想过这样一个问题,当A、B表同时更改一个字段的时候,结果应该以谁为准?
那100个字段岂不是要写100个次?原来的触发器肯定存在有问题,它会覆盖B更改过的值,就算不同时更新一条数据
就好像原来
A: B:
ID,t1,t2,t3,t4,t5,t6,t7,t8,t9 ID,t1,t2,t3,t4,t5,t6,t7,t8,t9
0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9更新BA: B:
ID,t1,t2,t3,t4,t5,t6,t7,t8,t9 ID,t1,t2,t3,t4,t5,t6,t7,t8,t9
0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 0 ,1 ,1 ,1 ,1 ,5 ,6 ,7 ,8 ,9更新A(这里我只更新最后一个字段)A: B:
ID,t1,t2,t3,t4,t5,t6,t7,t8,t9 ID,t1,t2,t3,t4,t5,t6,t7,t8,t9
0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,0 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,0它把B之前更改的覆盖掉了,这是不希望见到的不知道能不能用columns_updated()来简化