插入后的Sql触发器更新具有条件的另一个表

时间:2015-02-11 15:02:49

标签: sql sql-server triggers

我正在创建After Insert触发器,它工作正常,但我在执行触发器内的语句之前有一些条件

  
      
  1. 基于不同的CustomerId运行触发器,我想检查在我的LoyaltyDetailsTable中插入了哪个CustomerId,如果最后一次插入   是Customerid = 2然后传递那个条件然后运行的Customerid   触发器,或者如果Customerid = 1,则运行该Id的触发器,   等等。
  2.   
  3. 我想检查在PriceClaimTable中是否存在插入的CustomerId,如果存在则更新详细信息,否则只需插入   仅限LoyaltyDetailsTable中的值。
  4.   

触发查询

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是表结构。

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

您在这里寻找的是inserted表。每次发出UPDATE语句时,SQL Server都会生成两个名为inserteddeleted的虚拟表,用于存储有关您正在进行的数据修改的信息。可以从触发器访问这些表。有关详细信息,请参阅此处:https://msdn.microsoft.com/en-us/library/ms191300.aspx

您可以使用inserted获取您要查找的ID。所以,而不是:

WHERE ClaimCustomerId=1

你可以使用:

WHERE ClaimCustomerId=inserted.ClaimCustomerId