我一直在使用 .dacpacs 将数据库更新部署到我们的各种环境中。我发现了一个导致特定更新发布失败的场景。
我需要添加一个新表dbo.Supplier
并将一列添加到另一个dbo.PickZone
具有引用新表的不可空外键的表中。SSDT 项目中的架构反映了这一点,为了准备新的 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 deploy 都准备了所需的架构更新,然后执行预部署脚本,然后执行架构更新 - 由于预部署脚本制作架构,这些更新现在不同步变化。
这会导致架构发布再次尝试添加表和列,并导致它失败。
我显然可以更改我的部署过程以在 dacpac 部署之外执行这些类型的准备脚本,但我有点希望 dacpac 负责所有架构更改......
有谁知道让 dacpac 发布以适应此类更新的方法?