2013-09-29 59 views
0

我有这些表后存储过程使INSERT,UPDATE,其他表触发

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

Extra_Charges

  • Extra_Charge_ID
  • 金额
  • 说明

Tourist_Extra_Charges

  • Tourist_ID - 外键
  • Extra_Charge_ID - 外键

但是,当一个用户在第一次进行预约 - 例如,基本包费用500欧元 - 它被插入Reservation表中的TotalAmount列。

但是,在下一个表格中,用户可以选择extra_charges哪个(但他也可以不选择任何extra_charges),它们立即插入Tourist_Extra_charges表中。

问题是,由于用户选择extra_charges,我应该更新列TotalAMount。

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

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 [email protected]_ID 
    END 

回答

2

你需要考虑的很重要的事情是,插入表可能有比它的单个记录,在这种情况下,你想你的实现将无法正常工作了。例如,如果您有批量更新,则会发生这种情况。

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

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

选项2是我一般倾向于选择的选项,因为它很难打破。