0

我最近开始使用 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
4

1 回答 1

0

由于错误仅发生在应用程序中,因此我会分析以准确查看正在发送的内容。也许您认为插入的表中的内容不是实际进入的内容。如果它发送一批两条记录,它们是相同但当前不在表中,它可能会出现此错误。

于 2012-04-04T15:49:57.940 回答