由于“指定的事件类型在指定的目标对象上无效”,无法在 SQL 表上创建触发器。
Posted
技术标签:
【中文标题】由于“指定的事件类型在指定的目标对象上无效”,无法在 SQL 表上创建触发器。【英文标题】:Not Able to Create Trigger on SQL Table due to 'The specified event type(s) is/are not valid on the specified target object.' 【发布时间】:2019-06-12 16:45:36 【问题描述】:我正在尝试在表上创建触发器,我在 SQL 工作室中遇到上述问题作为语法错误,并在运行 SQL 语句时收到以下错误:
消息 102,级别 15,状态 1,过程 UpdatePo,第 9 行 [批处理开始第 18 行] 'INSERT' 附近的语法不正确
这是我要创建的触发器:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER dbo.tiTrigger
ON dbo.TABLE_ONE
AFTER [INSERT]
AS
SET NOCOUNT ON;
DECLARE @po_state VARCHAR(20)
DECLARE @po_number VARCHAR(255)
SELECT @po_state = order_state FROM inserted
SELECT @po_number = po_number FROM inserted
UPDATE TABLE_TWO
SET PO_Status = @po_state
WHERE PO_Number = @po_number
GO
【问题讨论】:
你有一个名为 UpdatePo 的 DDL 触发器吗? 【参考方案1】:这个失败的原因是你需要删除INSERT周围的方括号,它不是一个对象名。
但是,您的触发器已损坏。它有一个重大的逻辑缺陷,即只会插入一行。 sql server 中的触发器每次操作触发一次。您需要将其重写为基于集合的方法。这个简单的更新可以而且应该在没有任何变量的情况下完成,只需一个简单的连接。
根据这个集合做会是这样的。
CREATE TRIGGER dbo.tiTrigger
ON dbo.TABLE_ONE
AFTER INSERT
AS
SET NOCOUNT ON;
UPDATE t
set PO_Status = i.order_state
from TABLE_TWO t
join inserted i on i.po_number = t.PO_Number
GO
【讨论】:
感谢您的建议和回答。以上是关于由于“指定的事件类型在指定的目标对象上无效”,无法在 SQL 表上创建触发器。的主要内容,如果未能解决你的问题,请参考以下文章