СОЗДАТЬ ТРИГГЕР; Неправильный синтаксис рядом с DECLARE

Вот мой код:

CREATE TRIGGER trg_Booking
ON Bookings
FOR INSERT, UPDATE

DECLARE @bef AS varchar(25)

SELECT @bef = Role
FROM Inserted, booksys.dbo.Employees
WHERE Inserted.EmployeeNo = Employees.EmployeeNo

IF NOT (@bef = 'Foreman')

BEGIN 
    RAISERROR ('Only a Foreman can do that!',16,1)
    ROLLBACK TRANSACTION
END

Я продолжаю получать сообщение об ошибке при попытке выполнить и создать триггер; "Сообщение 156, уровень 15, состояние 1, процедура trg_booking, строка 5. Неверный синтаксис рядом с ключевым словом "DECLARE"".

Также, кажется, SQL Server не распознает объект «Вставленный»?

Я использую SQL Server 2014 и Management Studio.


person Jerri Kangasniemi    schedule 16.01.2015    source источник
comment
Этот триггер не обрабатывает многострочные вставки. В этих случаях резидентная таблица inserted будет содержать несколько строк, и значение, которое вы присваиваете @bef, практически случайное. Кроме того, синтаксис соединения, который вы используете, был заменен в 1992 году на явный синтаксис соединения, хотя это и правильно, но очень устарело и Есть несколько веских причин не использовать его   -  person GarethD    schedule 16.01.2015
comment
Плохие привычки: использование JOIN в старом стиле — старый стиль разделенного запятыми списка таблиц был заменен на правильный синтаксис ANSI JOIN в Стандарт ANSI-92 SQL (более 20 лет назад), и его использование не рекомендуется.   -  person marc_s    schedule 16.01.2015
comment
Изменено на внутреннее соединение. Спасибо. Я думаю, пришло время обновить базу кодов в моем мозгу и перестать использовать устаревший код. Спасибо за совет. :)   -  person Jerri Kangasniemi    schedule 16.01.2015


Ответы (1)


Вы пропали без вести As после FOR INSERT, UPDATE

если у вас более одного оператора внутри trigger, всегда используйте Begin and END

CREATE TRIGGER booksys.dbo.trg_Booking
ON booksys.dbo.Bookings
FOR INSERT, UPDATE
as
Begin

IF Not exists ( SELECT 1 
FROM Inserted Inner Join booksys.dbo.Employees
on Inserted.EmployeeNo = Employees.EmployeeNo
where Role='Foreman')

BEGIN 
    RAISERROR ('Only a Foreman can do that!',16,1)
    ROLLBACK TRANSACTION
END
END
person Pரதீப்    schedule 16.01.2015
comment
Спасибо! Это помогло те ошибки. Но по какой-то причине он создал новый; Сообщение 8197, уровень 16, состояние 4, процедура trg_Booking, строка 1 Объект «Бронирования» не существует или недействителен для этой операции. Есть идеи, почему? - person Jerri Kangasniemi; 16.01.2015
comment
@JerriKangasniemi - У вас есть таблица с именем Bookings в базе данных booksys? - person Pரதீப்; 16.01.2015
comment
@JerriKangasniemi - Проверьте, я обновил полное имя - person Pரதீப்; 16.01.2015
comment
да. У меня есть таблица Bookings в базе данных. В этой таблице у меня есть столбец с именем Foreman, в котором содержится номер сотрудника человека, совершившего бронирование. Этот человек должен иметь роль Foreman в столбце Role таблицы Employees. Имеет ли этот ответ смысл? Извините, английский мой второй язык. - person Jerri Kangasniemi; 16.01.2015
comment
@JerriKangasniemi - Обновлено на основе ваших требований, проверьте сейчас - person Pரதீப்; 16.01.2015
comment
@JerriKangasniemi - если вы разместили уникальное ограничение в таблице «Сотрудники» для обоих столбцов EmployeeNo, Role и добавили вычисляемый столбец в Bookings, который представляет собой просто постоянный текст Foreman, тогда вы могли бы применить многостолбцовый внешний ключ между этими таблицами и не иметь триггер вообще. - person Damien_The_Unbeliever; 16.01.2015
comment
Не обращайте внимания на мой последний комментарий. Это я просто не умел писать правильно. Однако я все еще получаю сообщение об ошибке, которого раньше не видел. Msg 2108, Level 15, State 1, Procedure trg_Booking, Line 1 Cannot create trigger on 'booksys.dbo.Bookings' as the target is not in the current database.. Я предполагаю, что по какой-то причине он пытается создать триггер внутри базы данных master? Я решил это, щелкнув правой кнопкой мыши базу данных и настроив таким образом правильную базу данных, но есть ли более надежный способ сделать это в самом запросе? - person Jerri Kangasniemi; 16.01.2015