我最近遇到了linq-to-sql的一些问题。问题是,当我们有一个附加到事件的触发器时,它“认为”它在插入和更新时失败。 一个示例可以是一行,其中附加了一个触发器,以便在更改行时将“LastUpdated”冒号设置为当前时间。这将导致linq-to-sql认为在更新或插入时失败,但这只是有时候,因为它有时会通过,我认为这是当sql服务器负载很重的时候因此不能在进行验证之前执行触发器,这只是猜测。 因为我的脚本只是一个更大的脚本的一部分,所以禁用触发器不是一个选项,所以我需要找到一个解决方案,或重写我的程序。 您是否遇到过这个问题并找到了解决方案,例如在插入后禁用验证?
触发器。
USE [cnhha]
GO
/****** Object: Trigger [dbo].[LastUpdated] Script Date: 05/12/2011 16:26:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[LastUpdated] ON [dbo].[CN_User]
FOR INSERT, UPDATE
AS
update cn_user set lastupdated=getdate() where campusnetuserid in (select campusnetuserid from inserted)
答案 0 :(得分:7)
您的触发器中可能需要SET NOCOUNT ON
除了question "SET NOCOUNT ON usage"中提到的狭义案例(SQLDataAdapter)之外,大多数客户端代码都需要它
如果您能够更改客户端UPDATE以使用DEFAULT关键字
,也可以删除触发器update cn_user
set col1 = this, col2 = that,...,
lastupdated= DEFAULT
where ...
答案 1 :(得分:2)
您的触发器是否通过SELECT
语句返回任何数据?请参阅此MSDN文章:CREATE TRIGGER
当触发器触发时,结果为 返回到调用应用程序, 就像存储过程一样。至 消除结果返回 由于触发而导致的应用程序 射击,不包括SELECT 返回结果的语句,或 执行变量的语句 触发器中的赋值。 触发器 包括SELECT语句 将结果返回给用户或 执行变量的语句 作业需要特殊处理; 这些返回的结果将不得不 写入每个应用程序 哪些修改触发器 表是允许的。如果变量 赋值必须在触发器中发生, 使用SET NOCOUNT语句 开始触发消除 返回任何结果集。
此外,如果您认为触发器导致数据库引擎负载过重,您是否考虑过使用Service Broker使其后处理异步?
如果您可以包含代表性触发器的代码,则可以帮助我们进一步诊断您遇到的问题。
答案 2 :(得分:0)
您可以从SQL事件探查器获取该过程中发生的所有活动的帮助。您可以捕获有关每个事件的数据并将其保存到文件或表中。
答案 3 :(得分:0)
如果让触发器更新代码后面的属性值会弄乱你的自定义实体验证逻辑,你可以完全避免触发器并直接在实体上设置LastUpdated
属性,或者不执行任何验证(关于模式验证)关于LastUpdated
属性的值?