情况如下:有villager表,字段有id,x,y,amount,speed,stat这些个字段. 
如: id  x  y  amount speed stat
3  400 500  100  9  0
还有一张location表,字段有id,x,y,kind,kindid.
如:id  x  y   kind  kindid 
1  400 500 2      3villager表放id为3这个村民的详细数据,location放id为3这个村民的位置数据在villager中的x和y有时会被程序修改,我要设计一个触发器,在villager中x或y被改变的时候,自动的去更新location表中该村民的x,y但不知道程序是会只修改x,或只修改y,还是x和y都被修改.不过,我最好只需要一次更新location表x,y游标和存储过程写过不少,触发器还没写过,我的数据库是sql2005,请大家帮忙,先谢了

解决方案 »

  1.   

    IF UPDATE(X) OR UPDATE(Y)
    ..
      

  2.   


    create trigger tu_villager on villager 
    for update
    as 
    if update(x) or update(y)
    update b set x=a.x ,y=a.y  from inserted a,location b where a.id=b.kindid 
    go
      

  3.   

    Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。更新事务类似于在删除之后执行插入;首先旧行被复制到 deleted 表中,然后新行被复制到触发器表和 inserted 表中。在设置触发器条件时,应当为引发触发器的操作恰当使用 inserted 和 deleted 表。虽然在测试 INSERT 时引用 deleted 表或在测试 DELETE 时引用 inserted 表不会引起任何错误,但是在这种情形下这些触发器测试表中不会包含任何行。 
    后面的a是表inserted的别名
      

  4.   

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    goALTER trigger [tu_villager] on [dbo].[villager] 
    for update
    as 
    if update(x) or update(y) or update(px) or update(py)update location set x=villager.x ,y=villager.y, px=villager.px ,py=villager.py    from villager,location  where kind=1 and villager.id=location.kindid 这个测试了一下,OK