插入更新另一个表触发器后创建存储过程

时间:2013-09-29 14:09:08

标签: sql-server-2008 triggers

我有这些表:

预订

  • Reseration_ID
  • User_ID
  • Total_Amount

Tourist_Reservation

  • Tourist_ID-外键
  • Reservation_ID - 预订的外键

Extra_Charges

  • Extra_Charge_ID
  • 金额
  • 描述

Tourist_Extra_Charges

  • Tourist_ID - 外键
  • Extra_Charge_ID - 外键

但是,当用户首先进行预订时 - 例如,基本数据包需要500欧元 - 它被插入TotalAmount表中的Reservation列。

但是在下一种形式中,用户可以选择extra_charges,它将立即插入extra_charges表中,但也可以选择Tourist_Extra_charges}。

问题在于,当用户选择了extra_charges时,我应该更新TotalAMount列。

因此,在tourist_extra_charges表中插入后,我想创建一个触发器来更新TotalAmount表中的列Reservation。这就是我想出来的。 如果我可以优化它,如果程序良好,请建议我。

CREATE TRIGGER [dbo].[tralAmount] on [dbo].[TOURIST_EXTRA_CHARGES] After Insert
AS
BEGIN
Declare @Res_ID int
Declare @Sum_toAdd money
   select @Res_ID = Reservation_ID from inserted
   Inner join TOURIST_RESERVATION on inserted.Tourist_ID=TOURIST_RESERVATION.Tourist_ID

   select @Sum_toAdd =  Amout from inserted
   Inner Join EXTRA_CHARGES on inserted.Extra_Charge_ID= EXTRA_CHARGES.Extra_Charge_ID

   Update RESERVATIONS 
     Set Reservation_TotalAmount = (Reservation_TotalAmount + @Sum_toAdd)
     where Reservation_ID=@Res_ID
   END

1 个答案:

答案 0 :(得分:2)

您需要考虑的重要事项是INSERTED表中可能包含多条记录,在这种情况下,您的实现将无法按预期运行。例如,如果您有批量更新,则会发生这种情况。

解决此问题的两种方法 - 您可以重写触发器以在INSERTED和额外费用之间的联接中进行更新;另请注意,您还需要为UPDATE实现此触发器,以确保值正确(并考虑删除)。

或者,您可以创建一个视图,该视图将两个表中的值相加,以便为每个预留提供一个总计。然后,只要您需要UI /报告的总数,就可以加入此视图。

选项2是我通常倾向于选择的选项,因为它更难以打破。