5

私は .dacpacs を使用して、データベースの更新をさまざまな環境に展開しています。特定の更新プログラムの発行が失敗する原因となるシナリオを発見しました。

新しいテーブルを追加し、新しいテーブルを参照する null 非許容の外部キーを持つdbo.Supplier別のテーブルに列を追加する必要があります。dbo.PickZoneSSDT プロジェクト内のスキーマはこれを反映しており、新しい NOT NULL 列に備えるために、次の配置前スクリプトがあります。

IF object_id('dbo.Supplier') IS NULL
BEGIN
    CREATE TABLE [dbo].[Supplier]
    (
        [SupplierId] INT IDENTITY(1,1) NOT NULL,
        [Name] varchar(50) NOT NULL,
        CONSTRAINT [PK_Supplier] PRIMARY KEY CLUSTERED ([SupplierId])
    );

    SET IDENTITY_INSERT [dbo].[Supplier] ON;
    INSERT INTO Supplier (SupplierId, Name) VALUES (1, 'Default Supplier')
    SET IDENTITY_INSERT [dbo].[Supplier] OFF;

    ALTER TABLE dbo.PickZone ADD SupplierId int NULL;

    UPDATE PickZone SET SupplierId = 1

END

上記のスクリプトは、スキーマとデータを更新して、公開が発生したときに (私は sqlpackage.exe を使用しています)、外部キー制約を に適用しても失敗しないようにしますdbo.PickZone.SupplierId

CREATE TABLE [dbo].[PickZone]
(
    [PickZoneId] INT IDENTITY (1, 1) NOT NULL PRIMARY KEY, 
    [Name] VARCHAR(50) NOT NULL,
    [SupplierId] INT NOT NULL,
    CONSTRAINT [FK_PickZone_Supplier] FOREIGN KEY ([SupplierId]) REFERENCES [dbo].[Supplier] ([SupplierId])
)

問題は、vs2012 Publish と sqlpackage.exe デプロイの両方が必要なスキーマの更新を準備し、デプロイ前スクリプトを実行してから、スキーマの更新を実行するように見えることです。変化します。

これにより、スキーマの公開でテーブルと列の追加が再度試行され、失敗します。

もちろん、dacpac デプロイの外部でこれらのタイプの準備スクリプトを実行するようにデプロイ プロセスを変更できますが、dacpac がすべてのスキーマ変更を担当するようにしたいと思います...

このタイプの更新に対応するためにdacpacを公開する方法を知っている人はいますか?

4

2 に答える 2