2015-12-30 59 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