2015-02-12 4 views
0

У меня есть 2 таблицы dbo.booking и dbo.seat с этими структурами:Как вставить SQL Server Update Trigger

  • dbo.booking имеет столбцы noBooking, noSeat, start, [end], statusBooked

  • dbo.seat имеет колонки noSeat, statusSeat

Каждая строка данных, которые я вставляю в dbo.booking () Значениеустанавливается в 1), то на dbo.seat колонке statusSeat (0 по умолчанию) будет обновлен до 1.

Если statusBooked обновляется 0, то statusSeat также обновит 0.

Я имею в виду statusSeat (0 по по умолчанию) обновит и последует значение statusBooked.

Я попытался с помощью триггера:

ALTER TRIGGER [dbo].[TriggerUpdateSeat] 
ON [dbo].[booking] 
AFTER INSERT, UPDATE 
AS 
    UPDATE dbo.seat 
    SET seat.statusSeat = i.statusBooked 
    FROM Inserted i 
    WHERE dbo.seat.noSeat = i.noSeat; 

Но проблема в том, когда первый раз, когда я вставить данные на dbo.booking, dbo.seat заполнены statusSeat это необходимо обновить до 1, но он не обновляется 1 не работает , Но для второго и вперед это работает. statusSeat Значение следующее statusBooked значение.

Проблема возникает только при первом запуске программы и вводе данных.

Почему?

+0

Кажется, что ваш стол 'seat' ссылается на' booking' через колонку 'noSeat' - правильно? Так зачем вам этот столбец 'statusSeat'? Просто сделайте соединение с таблицей 'dbo.Booking' и зачитайте' statusBooked' - нет смысла иметь два столбца, которые содержат одну и ту же информацию, и беспокоиться о том, чтобы их синхронизировать - избегайте избыточности данных! –

+0

да, резервирование мест с помощью колонки noSeat. , потому что у меня есть место, и я хочу показать, что забронировал и какие имеются, поэтому я добавляю statusSeat. statusBooked предназначен только для статуса транзакции.если бы я не добавил statusSeat, мне будет сложно выполнить в другом случае в моем проекте. так как решить мою проблему выше? @marc_s – azalikaEriya

ответ

0

Предположим, вы хотели видеть данные в Резервировании и соответствующие данные в Seat. Вы сделаете это с помощью соединения.

select b.*, s.* 
from Booking b 
join Seat  s 
    on s.noSeat = b.noSeat; 

Но вы хотите ограничить набор результатов тем, где значения статуса сиденья различны.

select s.*, b.* 
from Seat  s 
join Booking b 
    on b.noSeat = s.noSeat 
    and b.statusBooked <> s.statusSeat; 

Теперь просто превратить это в update заявление. Но также, это находится внутри триггера, поэтому на самом деле это не Бронирование.

update s 
    set s.statusSeat = b.statusBooked 
from Seat  s 
join Inserted b 
    on b.noSeat = s.noSeat 
    and b.statusBooked <> s.statusSeat; 
+0

Я не понимаю. пожалуйста, объясните мне больше – azalikaEriya

+0

Что вы не понимаете? Попробуй это. Выберите несколько строк в Seat и измените значение statusSeat, чтобы он не соответствовал статусу в Booking. Затем выполните каждый из запросов, которые я разместил выше. Видя, что все данные, которые вы выбрали для вас, могут быть весьма полезными. Затем выполните инструкцию обновления - кроме использования «Бронирование» вместо «Вставить». Это работает? Если в любое время есть что-то конкретное, вы не понимаете, покажите нам полученные результаты и скажите нам, что вы не понимаете. – TommCatt

0

Если вы правы, это решит вашу проблему. Ваш столбец statusSeat будет обновлен, как в столбце statusBooked, если statusBooked Обновлено. И ваш столбец statusSeat будет обновлен, как в столбце statusBooked, если statusBooked Вставлено и statusBooked больше 0 (поскольку оно по умолчанию 0).

ALTER TRIGGER [dbo].[TriggerUpdateSeat] 
    ON [dbo].[booking] 
    AFTER INSERT, UPDATE 
    AS 
IF UPDATE (statusBooked) 
BEGIN 
     UPDATE dbo.seat 
      SET seat.statusSeat = i.statusBooked 
      FROM Inserted i 
      WHERE dbo.seat.noSeat = i.noSeat; 
END 
ELSE 
BEGIN 
     UPDATE dbo.seat 
      SET seat.statusSeat = i.statusBooked 
      FROM Inserted i 
      WHERE dbo.seat.noSeat = i.noSeat and i.statusBooked>0; 
END