我一直在使用.dacpac文件将数据库更新部署到各个环境。我发现了一种情况,会导致特定更新的发布失败。
我需要添加一个名为
上述脚本更新模式和数据,以确保在发布发生时(我正在使用sqlpackage.exe),当它将外键约束应用于
问题在于,似乎vs2012发布和sqlpackage.exe部署都会准备所需的模式更新,然后执行预部署脚本,接着执行模式更新——由于预部署脚本进行了模式更改,所以现在这些更新已经不同步了。
这导致模式发布再次尝试添加表格和列,并导致发布失败。
我可以显然地改变我的部署流程,将这些类型的准备脚本执行在dacpac部署之外,但是我希望dacpac负责所有模式更改......
有人知道如何让dacpac发布适应这种类型的更新吗?
我需要添加一个名为
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发布和sqlpackage.exe部署都会准备所需的模式更新,然后执行预部署脚本,接着执行模式更新——由于预部署脚本进行了模式更改,所以现在这些更新已经不同步了。
这导致模式发布再次尝试添加表格和列,并导致发布失败。
我可以显然地改变我的部署流程,将这些类型的准备脚本执行在dacpac部署之外,但是我希望dacpac负责所有模式更改......
有人知道如何让dacpac发布适应这种类型的更新吗?