#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';