由于“指定的事件类型在指定的目标对象上无效”,无法在 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 表上创建触发器。的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 服务由于登录失败而无法启动怎么办

为啥我收到“由于保护级别而无法访问”错误?

由于目标计算机积极拒绝,无法连接。

为啥控件由于其保护级别而无法访问?

SVN 由于目标机器积极拒绝,无法连接

由于 ImportError,Python 无法运行:无法导入 MAXREPEAT