表A上有个字段X,类型为text;调用存储过程Proc_A_Update_X去更新这个字段,这个存储过程定义如下:
ALTER PROC [dbo].[Proc_A_Update_X] @ID char(32) , @textBlock text as update A set textBlock = null where ID=@ID DECLARE @ptrval varbinary(16) SELECT @ptrval = TEXTPTR(textBlock) FROM A WHERE ID=@fID WRITETEXT A.textBlock @ptrval with log @textBlock
在表A上建立一个触发器,当检测到字段X发生了变化,则在表B中插入X的内容。触发器定义如下:
ALTER Trigger [dbo].[Tri_A_InsteadUPdate] on [dbo].[A] instead of update as declare @ID char(31) declare @TxtBlock nvarchar(max) begin if update(X) begin select @TxtBlock = inserted.X,@ID= inserted.ID from inserted if (select count(*) from B where ID= @ID) = 0 begin insert into B(ID, x) values(@ID,@TxtBlock) end else begin UPdate B set X=@TxtBlock where ID=@ID end end end
现在问题是,触发器得到的txtBlock是更新前的数据,而不是存储过程更新后的数据(这让我很郁闷,明明是从inserted里读的嘛)。可能是因为在存储过程Proc_A_Update_X先是将X置为null了。但是这不是预期的结果。
请各位大神帮忙看看怎么才能在更新表A时,将数据同步到表B。
你是instead update。应该是after update吧。
after触发器不支持text,image,ntext数据类型,Instead触发器支持。
这个问题我已经解决。