web-dev-qa-db-ja.com

Projectを介してターゲットデータベースの既存のテーブルに列を追加することを含むSSDTを使用したデータベース変更の公開

新しいSSDTデータベースを作成する代わりに、ターゲットデータベースの既存のテーブル(以前はSSDTを介して作成されたもの)に列を追加することを含むSSDTを使用したデータベースの変更の公開。テーブル作成スクリプトまたはテーブル変更スクリプトを通じて列を追加しようとすると、同じエラーが発生しました。 Schema Compareを試しても、同じエラーが発生したターゲットデータベースのテーブルはまだ残っています。 SSDTパブリッシングを通じてターゲットデータベースオブジェクトへの変更を変更する方法

RAISERROR(N '行が検出されました。データ損失が発生する可能性があるため、スキーマの更新を終了しています。'、16、127)WITH NOWAIT;

私はチェックしてみました

  1. データ損失が発生する可能性がある場合は、増分展開をブロックします。

  2. レプリケートされたオブジェクトを変更しないでください。

  3. 変更データキャプチャオブジェクトは変更しないでください。

3
Koushik Reddy

これは、CREATE TABLEスクリプトの中央に列を追加したために発生しています。これにより、「テーブルの再構築」が発生します。数か月前にブログでこれについて話しました: SSDTの問題:テーブルの再構築

列の順序に関するセクションは、特定の問題です。次のようなテーブルがあるとします。

CREATE TABLE [dbo].[Post]
(
    [Id] INT IDENTITY(1,1) NOT NULL,
    [PostType] VARCHAR(10) NOT NULL
);

次に、列リストの中央に列を追加します。

CREATE TABLE [dbo].[Post]
(
    [Id] INT IDENTITY(1,1) NOT NULL,
    [CommentCount] INT NULL, -- NEW COLUMN IN THE MIDDLE
    [PostType] VARCHAR(10) NOT NULL
);

これにより、モデル全体(SSDTプロジェクト)とターゲットデータベース間で基になるテーブルメタデータの同期を維持するために、テーブル全体が「再構築」されます。

ソリューション?列を最後に追加するだけです:

CREATE TABLE [dbo].[Post]
(
    [Id] INT IDENTITY(1,1) NOT NULL,
    [PostType] VARCHAR(10) NOT NULL
    [CommentCount] INT NULL -- NEW COLUMN AT THE END
);

これはテーブルを再構築しないので、潜在的なデータ損失を引き起こしません。

4
Josh Darnell