【发布时间】:2012-04-04 12:44:37
【问题描述】:
我最近开始研究一个带有 SQL Server 2008R2 后端的 MVC3 应用程序。应用程序从 Web 查询接收流数据,然后在收到新数据时将数据插入表中。应用程序有时可以接收已经插入的数据(正在接收的数据包括一个预先生成的主键 - 在我的应用程序接收它之前已经生成了这个键)在这种情况下我不想将它插入到表中因为它已经存在。我意识到我可以生成自己的主键,但是我不希望数据库中有任何重复的行。
我能想到的最简单的解决方案是在每次插入时触发的表上的 INSTEAD OF 触发器,然后如果该行已经存在则忽略该插入(我当时的想法是 MVC 应用程序不需要检查以查看记录在尝试插入之前是否已经存在)。
这工作正常,但是当我将它移植到 SQL Azure 时,我现在每次 MVC 尝试插入已经存在的行时都会收到主键违规错误 - 就好像触发器不起作用一样。如果我连接到 SSMS 中的 SQL Azure 实例并尝试使用表中已经存在的键进行插入,我不会收到任何错误,因此我知道触发器存在并且正在运行。
在 MVC 代码中,我使用从数据库生成的 LINQ to SQL 类和这些类的 InsertOnSubmit 方法。
有谁知道为什么会发生这种情况?或者为我想要实现的目标提出一个更好的解决方案(我相信在 LINQ 或其他东西中可能有更好的方法)。我对 Azure、LINQ 和 MVC 还很陌生,所以欢迎提出任何建议!
提前致谢。
编辑:触发代码现在在下面——正如我所说,当我在本地 SQL DB 上运行它时它工作正常——如果我尝试使用已经存在的主键进行插入管理工作室中的 Azure DB 工作正常。该错误仅发生在针对 Azure DB 运行的 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
【问题讨论】:
-
请给我一个触发器好吗?
-
我首先要删除那个隐式连接。啊。在它们被更好的东西取代 20 年后,没有理由再写它们。它们是一种 Sql Anti 模式。 amazon.com/gp/product/1934356557/ref=kinw_rke_tl_1
-
如果您是新手,为什么使用 LINQ to SQL 而不是 EF?在 EF v. L2S 上,您可以获得 1000 倍的帮助。 -- 你不能打开 SQL 分析/跟踪,看看到底发生了什么吗? -- 考虑重新标记 - 这是一个纯 SQL Azure 问题,MVC 无关紧要
-
是的,我已将其重写为 ANSI 标准 SQL,尽管这对遇到的问题没有任何影响。是什么让您认为这是一个纯 Azure 问题,与 MVC 无关?因为直接连接到 Azure DB 时我没有遇到错误 - 我只在 MVC 应用程序中调用该方法时收到错误。感谢您的帮助!
标签: sql-server asp.net-mvc asp.net-mvc-3 linq-to-sql azure-sql-database