0

我最近開始使用SQL Server 2008R2後端開發一個MVC3應用程序。應用程序從Web查詢接收流式數據,然後在收到新數據時將數據插入表中。應用程序有時可以接收已插入的數據(正在接收的數據包含預生成的主鍵 - 在我的應用程序接收到它之前已生成此鍵),如果不想將此插入到表中因爲它已經存在。我意識到我可以生成自己的主鍵,但是我不想在數據庫中有任何重複的行。SQL Azure MVC3主鍵違例使用INSTEAD OF觸發器

我能想到的最簡單的解決方案是一個不是在表觸發器,在每次插入火災,並忽略插入如果行已經存在(我的想法是那麼的MVC應用程序並不那麼需要檢查在試圖插入之前查看該記錄是否已經存在)。

這工作正常,但是當我將它移植到SQL Azure時,現在每次MVC嘗試插入已存在的行時都會收到主鍵違例錯誤 - 就好像觸發器無法正常工作一樣。如果我連接到SSMS中的SQL Azure實例,並嘗試使用表中已存在的鍵進行插入操作,則不會收到任何錯誤,因此我知道該觸發器存在且正在運行。

在我使用LINQ到我從數據庫中,並在這些類的InsertOnSubmit方法生成的SQL類的MVC代碼。

有誰知道爲什麼會發生這種情況?或者建議一個更好的解決方案,我試圖實現(我相信有一種更好的方法可以在LINQ中完成)。我對Azure,LINQ和MVC非常陌生,因此歡迎任何建議!

在此先感謝。

編輯:觸發代碼現在下面 - 正如我所說的,這是工作正常,當我在我的本地SQL數據庫上運行它 - 如果我嘗試做使用在Azure的數據庫已經存在的主鍵插入管理工作室,它工作正常。該錯誤僅發生在針對Azure數據庫運行的MVC應用程序內。

CREATE TRIGGER [dbo].[IO_Trig_INS_User] ON [dbo].[STRM_User] 
INSTEAD OF INSERT 
AS 
BEGIN 
SET NOCOUNT ON 
--Check for existing user. If there is no duplicate, do an insert. 
IF (NOT EXISTS (SELECT P.UserId 
     FROM dbo.STRM_User P, inserted I 
     WHERE P.UserId = I.UserId)) 
    INSERT INTO dbo.STRM_User 
     SELECT * 
     FROM inserted 
END 
GO 
+0

請您介紹一下觸發器嗎? – 2012-04-04 13:00:31

+0

我會從刪除隱式連接開始。啊。在他們被更好的東西取代20年之後,沒有任何理由寫他們。他們是一個Sql反模式。 http://www.amazon.com/gp/product/1934356557/ref=kinw_rke_tl_1 – HLGEM 2012-04-04 15:47:24

+0

如果你是新手,你爲什麼使用LINQ to SQL而不是EF?您可以在EF v。L2S上獲得1000倍以上的幫助。 - 你不能打開SQL分析/跟蹤,看看究竟發生了什麼? - 考慮重新命名 - 這是一個純粹的SQL Azure問題,MVC是無關緊要的 – RickAndMSFT 2012-04-04 17:49:58

回答

0

由於錯誤只從應用程序發生了,我會個人資料,看看到底是什麼在被髮送。或許你認爲是進入插入表不是什麼是真正打算。如果它發送一個一批兩個相同但目前不在表中的記錄,它可能會得到這個錯誤。

+0

我已經這樣做了 - 正在發送的是預期的內容。在SQL2008R2上運行時,該應用程序工作正常,只有在指向Azure數據庫時纔會出錯。 – 2012-04-04 17:48:20

相關問題