【问题标题】:Insert/update trigger updating column value of all rows插入/更新触发器更新所有行的列值
【发布时间】:2015-12-28 10:58:07
【问题描述】:

我遇到了一个逻辑问题。我的触发器是:

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

update AspNetUsers set User_points = @value * 3
where ( AspNetUsers.Id = @postedby)

我不知道自己做得对不对。

两个表:以 User_points 列和 Id 列为主键的 AspNetUsers 表

以 PostId 作为主键和 PostedBy 作为外键引用 AspNetUsers 表的 Posts 表。

现在,我想比较 PostedBy 和 Id 列,如果它们都相同,则在他发布的每条消息上用 +3 更新 User_Points 列。

现在,问题是: 1> 它在每一行中插入相同数量的点。它应该只检查当前插入的行和该行的 PostedBy 列,然后与其他表的 Id 列进行比较,并且应该只更新该 Id 的用户点。

但是同样的结果什么也没发生 请告诉我该怎么做。 提前致谢

【问题讨论】:

    标签: asp.net sql-server asp.net-mvc triggers


    【解决方案1】:

    改变

    select @postedby = PostedBy from Posts 
    

    select @postedby = PostedBy from INSERTED
    

    'INSERTED' 是一个将插入/更新数据保存在此范围内的魔术表。 与此“已删除”表相同,将以前的数据保持在更新行中

    【讨论】:

    • 更新多行列@Musthaan 的结果仍然相同
    • 您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器将每条语句触发一次,因此如果INSERT 语句影响25 行,您将触发触发器一次,但随后Inserted 将包含25行。您的代码将在这 25 行中选择哪一行? SELECT @postedBy = PostedBy FROM Inserted - 它是不确定的 - 你会得到一个任意行,你会忽略所有其他行。您需要重写触发器以考虑到这一点!
    • 感谢您的回复先生,我在最后一行的条件下苦苦挣扎。我使用了相同的参数并尝试在新表中插入值以查看 @postedBy 包含的内容。插入 Employee_Demo(PostedBy, TotalCount) 值 (@postedby,@value );但它正在插入正确的值,但在更新条件下失败
    猜你喜欢
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多