2

VS 2010 Premium RTMRel (10.0.30319.1) と SS2008 を使用しています。AOK を構築するデータベースがあり、いくつかのサンプル データをロードする配置後スクリプトがあります。VS UI を介してこの DB をビルドしてデプロイすると、問題なく動作します。vsdbcmd を使用して展開しようとすると、次のようなエラーでデータの作成に失敗します。

** * SQL01268 C:\source\mydatabase.sql (5197,0) .Net SqlClient データ プロバイダー: メッセージ 2627、レベル 14、状態 1、行 227 PRIMARY KEY 制約 'pk_customers' の違反。オブジェクト 'dbo.customers' に重複するキーを挿入できません。* *

デモ目的で、特定のレコードを顧客テーブルに入力しようとしており、id 列の IDENTITY プロパティをオーバーライドして、選択した値を設定しています。デプロイ後のスクリプトの関連する行は次のとおりです。

SET IDENTITY_INSERT [dbo].[customers] ON
INSERT INTO [dbo].[customers] ([id], [name], [notes]) VALUES ( 10001, N'ABC Co', NULL )
SET IDENTITY_INSERT [dbo].[customers] OFF

コマンドラインではなく、UI を介して (SET IDENTITY INSERT ON を使用して) IDENTITY 列をオーバーライドできる理由を知っている人はいますか?

いいえ、顧客テーブルに id = 10001 のレコードが既に存在する可能性はありません。テーブルには他のレコード (または挿入) はまったくありません。

エラーメッセージの「オブジェクトの重複キー」の部分は完全に間違っており、PK列に自分の値を入れようとしていることに反対していると思います。

PK 制約には標準のデフォルトがあります。デフォルトを変更して IGNORE_DUP_KEY = ON に設定すると、コマンド ライン デプロイが機能します。しかし、私はそれをする必要はありません。

洞察や提案をいただければ幸いです。

4

1 に答える 1

1

わかりました、恥ずかしいです。

私のデプロイ後のスクリプトには、デフォルトの DB 名 (MobileDB と呼びます) を指定する USE ステートメントが含まれていることがわかりました。UI を介して構築していたとき、この MobileDB 名も使用していました。展開構成は常にデータベースを再作成していたため、すべてが正常に機能していました。

ただし、vsdbcmd からデプロイしたときは、ランダムな DB 名 (ChickenSoup など) を使用していました。そのため、データ作成スクリプトが実行されると、MobileDB に書き戻そうとし、既にそこにあったデータにヒットし、PK 制約違反で失敗しました。

クラシック ユーザー エラー。

于 2011-02-01T20:58:48.690 に答える