0

私はこれらのテーブルを持っています:

予約

  • Reseration_ID
  • ユーザーID
  • 合計金額

観光_予約

  • Tourist_ID - 外部キー
  • Reservation_ID - 予約への外部キー

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の列を更新するトリガーを作成したいと考えています。そして、これが私が思いついたものです。最適化できるかどうか、また全体として手順が適切かどうかアドバイスをお願いします。TotalAmountReservation

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 テーブルに複数のレコードが含まれる可能性があることです。その場合、実装は意図したとおりに機能しません。これは、たとえば一括更新がある場合に発生します。

これに取り組む 2 つの方法 - INSERTED と追加料金の間の結合全体で更新を行うようにトリガーを書き直すことができます。また、UPDATE にもこのトリガーを実装して、値が正しいことを確認する必要があることに注意してください (また、削除についても考えてください)。

または、両方のテーブルの値を合計して、予約ごとに 1 つの合計を出すビューを作成することもできます。UI/レポートの合計が必要なときはいつでも、このビューに参加できます。

オプション 2 は、破るのが難しいため、私が一般的に好む傾向があるオプションです。

于 2013-09-29T16:24:44.630 に答える