2015-12-30 81 views
0

这是我的触发器:凡在插入/更新触发条件不工作

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 

这里,在最后一行,在条件总是fails.Its不采摘正确的ID,并在所有的User_Points更新列相同的值行不在特定行中。

我写了一个INSERT语句来检查我得到什么值回这样的:

insert into Employee_Demo(PostedBy, TotalCount) 
    values (@postedby,@value); 

在这里,我得到表正确@postedby值。 Previosly,我是想这样的:

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不是邮件列表中的主键。它是aspnetuser表的外键,它包含发布邮件的用户的id值,如下图所示。 enter image description here

想这太:

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 
+0

你的触发器有** MAJOR **缺陷,你似乎认为它会被称为**每行**一次 - 这是**不是**的情况。触发器将在每个语句**中触发一次**,所以如果你的引发这个触发器的'INSERT'或'UPDATE'语句一次触发25行,你将触发**触发一次**,但是然后“插入”和“删除”将分别包含25行。您的代码在这25行中选择哪一个? 'select @Id = [PostedBy] from inserted;' - 这是非确定性的,你会得到**一个任意的行**,你将**忽略所有其他行**。 –

回答

0

目前,你在比较相同的变量条款,在这里你都应该DB领域比较变量。

+0

在最后一个我用过的更新AspNetUsers设置User_points = @value * 3 其中Id = [at] posted by – duke

0

终于得到了与此查询的工作不知道是怎么回事了

update AspNetUsers set User_points = @value * 3 
where Id = (Select PostedBy from inserted) 

和删除@Id或@PostedBy的声明。当我声明这些变量,然后从插入赋值给那些变量,然后在那里使用该变量值,那么它不工作。 取而代之的是,直接从插入的表中获取条件的工作情况。

+0

这个触发器被打破。 'inserted'可能包含0,1或*多*行。在后一种情况下,该触发器将按照“子查询返回多个值”的错误发生错误。您需要编写一个* set-based *触发器,以正确处理'inserted'中的多行。你可能还想考虑用视图替换所有这些(如果性能是一个问题,可能会编入索引),因为你似乎正在存储从其他数据中很容易计算*的数据(这只是为数据提供了机会不一致) –

+0

我认为你是对的先生。我对此不太了解。据我所知,插入是一个神奇的表,它保留最新插入的记录。因此,无论何时在post表中插入新数据,触发器都会从插入的表中检查Id并更新该行。反之,如何编写基于set的触发器在这里任何帮助表示赞赏@Damien_The_Unbeliever – duke