修改要插入的数据的触发器不起作用(语句包含没有 INTO 子句的 OUTPUT 子句)
Posted
技术标签:
【中文标题】修改要插入的数据的触发器不起作用(语句包含没有 INTO 子句的 OUTPUT 子句)【英文标题】:Trigger for modifying data to be inserted does not work (statement contains an OUTPUT clause without INTO clause) 【发布时间】:2017-06-28 07:18:22 【问题描述】:我需要非常简单的任务 - 替换要插入表格的两列中的日期和时间。这传播到非常困难的事情。我尝试了很多东西,从How can I edit values of an INSERT in a trigger on SQL Server? 开始。然后我阅读了关于 OUTPUT 并尝试了这个:
CREATE TRIGGER RouteSheetRecordDatesCorrection ON dbo.RouteSheetRecords
AFTER INSERT
AS
BEGIN
DECLARE @T TABLE
(
[Id] int,
[AccomplishmentDate] datetime2,
[RouteSheetRecordOperationId] int,
[WorkerName] varchar(50),
[RouteSheetProductId] varchar(72),
[Notes] varchar(500),
[Location] varchar(100),
[CreationDate] datetime2,
[Creator] varchar(30),
[Components] varchar(max)
)
UPDATE dbo.RouteSheetRecords
SET AccomplishmentDate = GETDATE(), CreationDate = GETDATE()
OUTPUT inserted.Id,
inserted.AccomplishmentDate,
inserted.RouteSheetRecordOperationId,
inserted.WorkerName,
inserted.RouteSheetProductId,
inserted.Notes,
inserted.Location,
inserted.CreationDate,
inserted.Creator,
inserted.Components
INTO @T
WHERE Id = (SELECT Id FROM inserted)
END
GO
但无论我尝试什么,在插入新行时,我总是会收到带有此消息的 SqlException:
如果 DML 语句的目标表 'dbo.RouteSheetRecords' 包含没有 INTO 子句的 OUTPUT 子句,则该语句不能有任何启用的触发器。
【问题讨论】:
你为什么要使用OUTPUT
?如果您只想更新这两个列,那就去做——没有必要用第二个表来解决问题。 (另外,因为它们是DATETIME2
,所以使用SYSDATETIME()
,而不是GETDATE()
——你正在丢掉精度。)(另外,永远不要忘记你的触发器中的SET NOCOUNT ON
。)(另外,使用WHERE Id IN
,不是WHERE Id =
。更新可以影响尽可能多的行。)
请注意,如果 其他代码 尝试使用不使用 INTO
的 OUTPUT
子句在此表上执行插入/更新,它将失败,因为您的触发器(使用您发布的消息)。唯一的办法是重写该代码,或删除您的触发器。不过,从上下文中不清楚是否发生了这种情况。
我使用 OUTPUT 是因为 ***.com/questions/13198476/… 推荐它作为该异常的解决方案。
即使像这样简单的事情也会引发上述异常:在 dbo.RouteSheetRecords 上创建触发器 RouteSheetRecordDatesCorrection 后插入开始更新 dbo.RouteSheetRecords SET AccomplishmentDate = SYSDATETIME(), CreationDate = SYSDATETIME() WHERE Id = (SELECT Id FROM 已插入)END GO
然后显示实际失败的语句。这不是触发器本身,而是一些外部插入/更新。还要验证表上是否还有其他触发器。
【参考方案1】:
问题是 PetaPoco ORM 在使用 Database.Insert 方法时插入了 OUTPUT 语句,并且该语句与触发器不兼容。解决方法是不将datetime2列转入数据库,使用数据库默认值或创建存储过程插入数据。
【讨论】:
以上是关于修改要插入的数据的触发器不起作用(语句包含没有 INTO 子句的 OUTPUT 子句)的主要内容,如果未能解决你的问题,请参考以下文章