2013-09-29 3 views
0

Я получил эти таблицы:Making хранимой процедуры после обновления вставки другой таблицы триггера

Бронирования

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

ответ

2

действительно важная вещь, которую вы должны учитывать, что вставленная таблица может иметь более одной записи в нем, в этом случае ваша реализация не будет работать, как вы намерены. Это произойдет, если у вас есть массовое обновление, например.

Два способа решения этой проблемы - вы можете переписать свой триггер, чтобы выполнить обновление через соединение между INSERTED и дополнительными расходами; также обратите внимание, что вам нужно будет реализовать этот триггер для UPDATE, чтобы гарантировать правильность значений (и подумайте об удалении).

В качестве альтернативы вы можете создать представление, которое суммирует значения из обеих таблиц, чтобы дать единую общую сумму для каждого резервирования. Затем вы можете присоединиться к этому представлению всякий раз, когда вам требуется общая сумма для ваших пользовательских интерфейсов/отчетов.

Вариант 2 - это тот, который я обычно предпочитаю, поскольку его труднее сломать.

Смежные вопросы