Sql 插入/更新触发器中的where条件不起作用

Sql 插入/更新触发器中的where条件不起作用,sql,sql-server,triggers,Sql,Sql Server,Triggers,这是我的触发器: Create trigger Points on Posts after insert, update As declare @Id int; declare @value int; select @value= Count(i.Message) from Posts i; select @Id = [PostedBy] from inserted; update AspNetUsers set User_points = @value

这是我的触发器:

  Create trigger Points
  on Posts
  after insert, update
  As
  declare @Id int;
  declare @value int;

  select @value= Count(i.Message) from Posts i;
  select @Id = [PostedBy] from inserted;

  update AspNetUsers set User_points = @value * 3
  where @Id = @Id
在这里,在最后一行,条件总是失败的。它没有在所有行(而不是特定行)中选择正确的Id并更新User_Points列中的相同值

我写了一个insert语句来检查我得到的值,如下所示:

   insert into Employee_Demo(PostedBy, TotalCount)
   values (@postedby,@value );
在这里,我得到了表中正确的@postedby值。 以前,我试过这个:

    create trigger Points
    on Posts
    after insert, update
    As
   declare @value int
   declare @postedby int
   select @value= Count(Message) from Posts
   select @postedby = PostedBy from inserted

   update AspNetUsers set User_points = @value * 3
   where Id = @postedby
请有人帮帮我。如何根据Id仅更新单行。 还有一件事,PostedBy不是post表中的主键。它是aspnetuser表的外键,它包含发布消息的用户的id值,如下图所示。

我也试过:

 update AspNetUsers set User_points = @value * 3
FROM INSERTED INNER JOIN Posts ON  INSERTED.PostedBy = Posts.PostedBy
INNER JOIN AspNetUsers ON AspNetUsers.Id = inserted.PostedBy

目前,您正在比较where子句中的同一个变量,您应该将DB字段与变量进行比较。

最终使用此查询得到它,但不知道它是如何发生的

 update AspNetUsers set User_points = @value * 3
 where Id = (Select PostedBy from inserted)
以及删除@Id或@PostedBy的声明。当我声明了那个些变量,然后将值从inserted赋值给那个些变量,然后在那个里使用那个变量值,那个么它就不起作用了。
相反,直接从条件起作用的插入表中获取值。

在上一个表中,我也使用了update AspNetUsers set User_points=@value*3,其中Id=[at]postedBy此触发器被破坏<代码>插入的可以包含0、1或多行。在后一种情况下,此触发器将中断,并出现“子查询返回多个值”行中的错误。您需要编写一个基于集合的触发器,以正确处理插入的
中的多行。您可能还想考虑用一个视图替换所有这些(如果性能是一个问题,可能索引),因为您似乎正在存储从其他数据中容易计算的数据(这正好打开了数据不一致的机会),我想您是对的,先生。我对此不太了解。据我所知,inserted是一个神奇的表,它保存着最新插入的记录。因此,每当在post表中插入新数据时,触发器都会检查插入表中的Id并更新该行。无论如何,如何在这里编写基于集合的触发器@Damien_感谢您的帮助。您的触发器有一个主要缺陷,您似乎认为它每行调用一次—事实并非如此。触发器将对每条语句触发一次,因此,如果导致触发此触发器的
INSERT
UPDATE
语句一次影响25行,则触发器将触发一次,但
Inserted
deleted
将分别包含25行。您的代码将在此处选择这25行中的哪一行<代码>从插入的代码中选择@Id=[PostedBy]-这是不确定的,您将得到一个任意行,并将忽略所有其他行。