【问题标题】:CREATE TRIGGER; Incorrect syntax near DECLARE创建触发器; DECLARE 附近的语法不正确
【发布时间】:2015-01-16 11:20:52
【问题描述】:

这是我的代码:

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 似乎无法识别“Inserted”对象?

我正在使用 SQL Server 2014 和 Management Studio。

【问题讨论】:

  • 此触发器不处理多行插入。在这些情况下,内存驻留表inserted 将包含多行,那么您分配给@bef 的值基本上是随机的。此外,您使用的连接语法在 1992 年被显式连接语法取代,虽然它没有错,但它非常过时,there are some compelling reasons not to use it
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(20 多年前),不鼓励使用它
  • 已更改为内部联接。谢谢。我想是时候更新我大脑中的“代码库”,停止使用古董代码了。谢谢你的提示。 :)

标签: sql-server syntax triggers declare


【解决方案1】:

FOR INSERT, UPDATE 之后,你错过了As

如果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

【讨论】:

  • 谢谢!这有助于这些错误。但出于某种原因,它创造了一个新的; “消息 8197,级别 16,状态 4,过程 trg_Booking,第 1 行对象 'Bookings' 不存在或对此操作无效。”。关于为什么的任何想法?
  • @JerriKangasniemi - 你在booksys 数据库中有一个名为Bookings 的表
  • @JerriKangasniemi - 现在检查我已经更新了完全限定的名称
  • 是的。我在数据库中有表Bookings。在该表中,我有一个名为Foreman 的列,其中包含进行预订的人员的员工编号。该人必须在表EmployeesRole 列中具有Foreman 的角色。这个答案有意义吗?对不起,英语是我的第二语言。
  • @JerriKangasniemi - 如果您在Employees 表中跨两列EmployeeNo, Role 放置一个唯一约束,并向Bookings 添加一个计算列,这只是常量文本Foreman,那么您可以应用这些表之间的多列外键,根本不需要触发器。
猜你喜欢
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多