0

我有这些表:

预订

  • Reseration_ID
  • 用户身份
  • 总金额

Tourist_Reservation

  • Tourist_ID-外键
  • Reservation_ID - Reservation 的外键

Extra_Charges

  • Extra_Charge_ID
  • 数量
  • 描述

Tourist_Extra_Charges

  • Tourist_ID - 外键
  • Extra_Charge_ID - 外键

但是,当用户首先进行预订时——例如,基本数据包的价格为 500 欧元——它会被插入到表中的TotalAmount列中Reservation

但是在下一个表单中,用户可以选择哪些将立即插入到表中extra_charges(但他也可能不会选择任何)。extra_chargesTourist_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
4

1 回答 1

2

您需要考虑的真正重要的事情是 INSERTED 表中可能有多个记录,在这种情况下,您的实现将无法按您的预期工作。例如,如果您有批量更新,就会发生这种情况。

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

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

选项 2 是我通常倾向于喜欢的选项,因为它更难破解。

于 2013-09-29T16:24:44.630 回答