最近、SQL Server 2008R2バックエンドを使用してMVC3アプリケーションの作業を開始しました。アプリケーションは、Webクエリからストリーミングデータを受け取り、新しいデータが受信されたときにそのデータをテーブルに挿入します。アプリケーションは、すでに挿入されているデータを受信することがあります(受信したデータには事前生成された主キーが含まれています - このキーはアプリケーションが受信する前に生成されています)すでに存在しているためです。私は自分のプライマリキーを生成することができますが、私はデータベースに重複する行がないようにします。SQL Azure MVC3の主キー違反INSTEAD OFトリガーを使用して
私が考えることができる最も簡単な解決策は、各インサートで発生するテーブルのINSTEAD OFトリガーであり、行が既に存在する場合は挿入を無視します(MVCアプリケーションはチェックする必要はありませんレコードが挿入を試みる前にすでに存在していたかどうかを確認してください)。
これは問題なく動作しましたが、SQL Azureに移植すると、MVCが既に存在する行を挿入しようとするたびに、主キー違反エラーが発生するようになりました。 SSMSでSQL Azureインスタンスに接続して、テーブルに既に存在するキーを使用して挿入を試しても、エラーは表示されないため、トリガーが存在し、機能していることがわかります。
MVCコードでは、データベースから生成したLINQ to SQLクラスと、これらのクラスのInsertOnSubmitメソッドを使用しています。
これはなぜ起こっているのでしょうか?あるいは、私が達成しようとしているものに対して、より良い解決策を提案することができます(LINQなどでこれを行うより良い方法があると確信しています)。私はAzure、LINQ、MVCにはかなり新しいので、どんな提案も歓迎です!
ありがとうございます。
編集:トリガーのコードは以下になりました - と私はAzureのDB上の既存の主キーを使用して、インサートを試してみませんかあれば - 私はこれは私が私の地元のSQL 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パターンです。 http://www.amazon.com/gp/product/1934356557/ref=kinw_rke_tl_1 – HLGEM
新しいのはなぜLINQ to SQLを使用していて、EFを使用していないのですか?あなたはEF対L2Sの1000倍の助けを得ることができます。 - SQLプロファイリング/トレースを有効にして、何が起こっているか正確に見ることはできませんか? - これは純粋なSQL Azureの質問です、MVCは無関係です – RickAndMSFT