Запуск после вставки обновления данных

#sql-server

#sql-сервер

Вопрос:

У меня есть резервирование 3 столов, билет и место. Они подключаются как резервирование.code_of_ticket = Билет.код и билет.number_of_seat = Seat.number. В table Ticket — это занятие атрибута, мне нужно изменить его, когда я вставляю данные в резервирование таблицы. Возможно ли это сделать таким образом?

 CREATE TRIGGER occupancy
ON Reservation
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE Seat
    INNER JOIN Seat ON Seat.number = Ticket.number_of_seat 
    INNER JOIN Ticket ON Ticket.code = Reservation.code_of_ticket 
    SET occupancy = 'reserved'
    WHERE occupancy = 'free';
END
  

Комментарии:

1. Вы пробовали это? Есть некоторые проблемы с вашим кодом. Вы не имеете в виду «вставленный» набор строк. Именно здесь триггер может получить доступ к новым строкам. Кроме того, вы ссылаетесь на «Резервирование». в вашем предикате соединения без ссылки на таблицу.

2. @user1443098 Все эти проблемы указывают на то, что Яна новичок и не имеет большого опыта. Я предлагаю вам определить эти факторы, чтобы дать лучшее руководство, а не просто отмечать ошибки.

3. Почему вы обновляете Seat таблицу, когда поле находится в Ticket таблице? Для меня это не имеет смысла, но это то, что заявил OP… In table Ticket is attribute occupation, I need change it when I insert data to table Reservation.

Ответ №1:

Ваша базовая логика верна, синтаксис ужасно неправильный. При работе с триггерами мы используем специальные таблицы inserted и deleted , которые содержат информацию об изменениях данных и имеют ту же структуру, что и базовая таблица. Триггер должен выглядеть примерно так:

 CREATE TRIGGER occupancy
ON Reservation
AFTER INSERT
AS
SET NOCOUNT ON;

UPDATE s --This is an alias for the table Seat
SET occypancy = 'reserved'
FROM Seat s --We can use FROM clauses like a normal SELECT
INNER JOIN Ticket t on s.number = t.number_of_seat --Is the seat number global or should you add a theater/auditorium number in your join logic?
INNER JOIN inserted i on t.code = i.code_of_ticket 
WHERE s.occypancy = 'free';