2011-05-04 15 views
11

最近我有一些linq-to-sql的問題。問題在於,當我們觸發附加事件時,它「認爲」插入和更新失敗。 一個示例可以是一行,其中觸發器被附加以將行更改時的「LastUpdated」冒號設置爲當前時間。這將導致linq-to-sql認爲更新或插入失敗,但這只是一些時候,因爲它有時會經過,我認爲這是當sql服務器負載很重,因此不能在進行驗證之前執行觸發器,這只是猜測。 由於我的腳本只是一個更大的腳本的一部分,因此禁用觸發器不是一種選擇,所以我需要找到解決方案或重寫我的程序。 有沒有人遇到過這個問題並找到了解決方案,例如在插入後禁用驗證?Linq-to-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

您可能必須在測試環境中禁用觸發器來驗證確實是問題所在。是否可以從LINQ2SQL語句中刪除觸發器更改的字段,以便它不嘗試驗證? – n8wrl 2011-05-06 13:30:11

+0

什麼類型的觸發器。在更新之前或更新之後? – 2011-05-06 13:30:45

+0

你可以添加觸發器看起來像什麼嗎? – DForck42 2011-05-11 15:36:23

回答

7

你可能需要SET NOCOUNT ON在觸發

除非我question "SET NOCOUNT ON usage"提到窄的情況下(SqlDataAdapter的),它最需要的客戶端代碼

您可以刪除觸發太多,如果你可以改變你的客戶端更新使用DEFAULT關鍵字

update cn_user 
set col1 = this, col2 = that,..., 
    lastupdated= DEFAULT 
where ... 
+0

這裏有很好的全面信息。 – arcain 2011-05-19 04:17:02

2

您的觸發器是否通過SELECT語句返回任何數據?看到這個MSDN文章:CREATE TRIGGER

當觸發火災,結果 返回給調用應用程序, 就像使用存儲過程。爲了消除 其結果返回給 應用由於觸發 射擊,不包括任何選擇 語句返回結果,或在觸發器執行變量賦值 陳述 。 觸發器 包含SELECT語句 返回結果給用戶或 語句執行變量 分配需要特殊處理; 這些返回的結果將不得不 被寫入 中的每個應用程序,允許修改觸發器 表。如果在觸發器中必須發生變量 分配,則 使用觸發器開頭的 處的SET NOCOUNT語句來消除返回任何結果集的 。

另外,如果您認爲觸發器在數據庫引擎上造成沉重的負擔,您是否考慮過使用Service Broker使其後處理異步?

如果您可以包含代表觸發器的代碼,它將幫助我們進一步診斷您遇到的問題。

+0

觸發器沒有選擇,並且不返回任何日期。我在第一篇文章中添加了有關觸發器的代碼! – Androme 2011-05-12 14:24:36

0

您可以從SQL事件探查器的幫助中瞭解在此過程中發生的所有活動。您可以捕獲每個事件的數據並將其保存到文件或表中。

+0

我們已經嘗試過使用SQL分析器,並且linq-to-sql發送到數據庫的所有命令都可以正常工作。這只是linq-to-sql本身,認爲它失敗 – Androme 2011-05-12 14:25:29

0

如果讓觸發器更新代碼背後的屬性值會混淆您的自定義實體驗證邏輯,您可以完全避免觸發器並直接設置實體上的LastUpdated屬性,也可以不執行任何驗證模式驗證)LastUpdated屬性的值?