2015-02-11 94 views
0

我創建插入觸發器後另一表後,其工作正常,但我必須在執行觸發器中的語句之前一定條件下基於不同客戶ID運行觸發SQL觸發器INSERT,UPDATE與條件

  1. ,我想檢查哪個CustomerId插入到我的LoyaltyDetailsTable中,比如說最後一個插入 是Customerid = 2,然後在該條件下傳遞該Customerid,然後運行 觸發器,或者如果Customerid = 1,則運行該觸發器, 等等。
  2. 我想檢查是否在PriceClaimTable中插入的CustomerId是否存在,如果存在則更新其他細節,只需在LoyaltyDetailsTable中插入 值。

觸發查詢

CREATE TRIGGER DetailsAfterInsert ON [dbo].[LoyaltyDetailsTable] 
FOR INSERT 

as 

UPDATE PriceClaimTable 
SET CurrentPoints = 
( 
(SELECT SUM(LoayaltyPointsTable.Points) AS RecentPoints FROM LoayaltyPointsTable 
join LoyaltyDetailsTable ON LoayaltyPointsTable.LoyaltyPointsId 
= LoyaltyDetailsTable.LoyaltyPointsId 
WHERE CustomerId=1 and LoyaltyDetailsId= (SELECT MAX(LoyaltyDetailsId) 
AS LoyaltyDetailsTable FROM LoyaltyDetailsTable)) 

+ 

(SELECT CurrentPoints FROM PriceClaimTable WHERE ClaimCustomerId=1 and 
PriceClaimId=(SELECT max(PriceClaimId) FROM PriceClaimTable 
)) 

) 
WHERE ClaimCustomerId=1 and PriceClaimId=(SELECT max(PriceClaimId) FROM PriceClaimTable) 

這是寫一個觸發我的第一次嘗試,並here是表結構。

任何幫助將是偉大的。

+0

? – 2015-02-11 15:08:37

+1

兩件事。首先你的觸發器沒有引用插入的虛擬表。其次,這似乎是一個計算列將比觸發更有意義。當你嘗試保持這樣的平衡時,你永遠不會有準確的數據。在某個時候它會失去同步。 – 2015-02-11 15:10:24

回答

1

你在這裏找的是inserted表。每次發出UPDATE語句時,SQL Server都會生成兩個名爲inserteddeleted的虛擬表,用於存儲有關所做數據修改的信息。這些表格可以從觸發器訪問。有關更多信息,請參閱此處:https://msdn.microsoft.com/en-us/library/ms191300.aspx

您可以使用inserted來獲取要查找的ID。所以,相反的:

WHERE ClaimCustomerId=1 

你可以使用:

您遇到什麼麻煩它的一部分與
WHERE ClaimCustomerId=inserted.ClaimCustomerId 
+0

嗨,這是個好主意,從[這裏](http://stackoverflow.com/questions/4404219/sql-server-trigger-on-insert-and-how-to-reference-the-data-that-was插入),我改變爲WHERE CustomerId =(從INSERTED選擇CustomerId),但我得到錯誤''無效的對象名稱'插入'。' – stom 2015-02-11 21:02:56

+0

非常感謝你,引導我,正如你所說我正在尋找一個單詞'插入',並提出瞭解決方案,錯誤:'無效的對象名稱'插入''。當我知道只有插入發生在表中時插入才運行。我設法正確地執行,有時候你的一個單詞在這裏以stackoverflow的方式訓練我們,所以如果你只有一小部分可以變成解決方案的話,就不要停下來回答。感謝你的努力。 – stom 2015-02-12 10:02:56