0

次の列を持つReservationsテーブルがあります

  1. Reservation_ID
  2. Res_TotalAmount - money
  3. Res_StartDate - datetime
  4. IsDeleted - bitデフォルト値の列 - false

そのため、ユーザーが予約を削除しようとすると、削除の代わりにトリガーを作成しました。列の値IsDeleteを true に更新するだけです。

ここまでは順調ですが、この旅行者は会社にいくらかの補償を支払う義務があるかもしれません。たとえば、予約から 30 日から 20 日後に予約をキャンセルした場合、その旅行者はstart_date30% を支払う義務がRes_TotalAmountあります。

そして、これが私のトリガーです

Create Trigger tr_TotalAMountUpdateAfterInsert on RESERVATIONS after Delete 
As 
Begin
   Declare @period int
   Declare @oldResAmount int
   Declare @newAmount money
   Declare @resID int

   Select @resID = Reservation_ID from deleted 
   select @oldResAmount = Res_TotalAmount from deleted
   Select @period= datediff (day,Res_StartDate,GETDATE()) from deleted

   case 
      @period is between 30 and 20 then @newAmount=30%*@oldResAmount
      @period is between 20 and 10 then @newAmount=50%*@oldResAmount
   end

   exec sp_NewReservationTotalAmount @newAmount @resID
End 
GO

Res_TotalAmountトリガーとストアド プロシージャの両方を使用する必要があるため、トリガーの最後に、列を更新するストアド プロシージャを 1 つ呼び出すことがわかります。

Create proc sp_NewReservationTotalAmount(@newTotalAmount money, @resID)
As 
   declare @resID int 

   Update RESERVATIONS set Res_TotalAmount=@newTotalAmount where Reservation_ID=resID

行く

  1. したがって、私の最初の問題は、ほとんどの場合に間違った構文が表示されることです

  2. そして私の 2 つ目 - トリガーとストアド プロシージャの両方を改善する方法を提案していただければ幸いです。

4

3 に答える 3