Sql server SSDT在表的末尾添加2列将导致表重建
我们正在使用Azure DevOps自动将更改部署到我们的生产数据库,这是一个Azure SQL数据库。这在大多数版本中运行良好,因为我们在大多数情况下都会进行有限的更改。有时给我们带来问题的是桌子重建,这需要很多时间才能完成。最终的结果是好的,只是长时间的运行会导致我们无法承受的网站宕机 我们正在使用VisualStudio中的一个数据库项目来管理此数据库和其他一些数据库。这包括一个xml文件,我们在使用SSDT发布时包含该文件,其中包含部署过程的设置。(即忽略列顺序等) 以下更改导致表的表重建:Sql server SSDT在表的末尾添加2列将导致表重建,sql-server,database,azure,azure-sql-database,sql-server-data-tools,Sql Server,Database,Azure,Azure Sql Database,Sql Server Data Tools,我们正在使用Azure DevOps自动将更改部署到我们的生产数据库,这是一个Azure SQL数据库。这在大多数版本中运行良好,因为我们在大多数情况下都会进行有限的更改。有时给我们带来问题的是桌子重建,这需要很多时间才能完成。最终的结果是好的,只是长时间的运行会导致我们无法承受的网站宕机 我们正在使用VisualStudio中的一个数据库项目来管理此数据库和其他一些数据库。这包括一个xml文件,我们在使用SSDT发布时包含该文件,其中包含部署过程的设置。(即忽略列顺序等) 以下更改导致表的表重
CREATE TABLE [dbo].[AccountCompany] (
[CompanyId] INT IDENTITY (1, 1) NOT NULL,
[AccountTypeCode] NVARCHAR (2) DEFAULT ('00') NOT NULL,
<Various columns, some with defaults>
[PONumberMandatoryUpstream] BIT NULL,
[PONumberMandatoryDownstream] BIT NULL,
CONSTRAINT [PK_AccountCompany] PRIMARY KEY CLUSTERED ([CompanyId] ASC),
CONSTRAINT [FK_AccountCompany_AccountBranchType] FOREIGN KEY ([BranchTypeCode]) REFERENCES [dbo].[AccountBranchType] ([BranchTypeCode]),
CONSTRAINT [FK_AccountCompany_AccountCustomerBusinessSegment] FOREIGN KEY ([BusinessSegment]) REFERENCES [dbo].[AccountCustomerBusinessSegment] ([BusinessSegmentCode]),
CONSTRAINT [FK_AccountCompany_AccountDmsEndpoint] FOREIGN KEY ([DmsEndpointId]) REFERENCES [dbo].[AccountDmsEndpoint] ([DmsEndpointId]),
CONSTRAINT [FK_AccountCompany_AccountDmsType] FOREIGN KEY ([DmsTypeCode]) REFERENCES [dbo].[AccountDmsType] ([DmsTypeCode]),
CONSTRAINT [FK_AccountCompany_AccountType] FOREIGN KEY ([AccountTypeCode]) REFERENCES [dbo].[AccountType] ([AccountTypeCode]),
CONSTRAINT [FK_AccountCompany_Currency_Purchase] FOREIGN KEY ([PurchaseCurrencyCode]) REFERENCES [dbo].[Currency] ([CurrencyCode]),
CONSTRAINT [FK_AccountCompany_Currency_Sales] FOREIGN KEY ([SalesCurrencyCode]) REFERENCES [dbo].[Currency] ([CurrencyCode]),
CONSTRAINT [FK_AccountCompany_MasterLanguage] FOREIGN KEY ([CultureCode]) REFERENCES [dbo].[MasterLanguage] ([CultureCode])
);
GO
CREATE NONCLUSTERED INDEX [IX_AccountCompany_LocationCode_Active]
ON [dbo].[AccountCompany]([LocationCode] ASC, [Active] ASC)
INCLUDE([AccountTypeCode], [BranchTypeCode], [DeliveryTimeDealer], [DeliveryTimeDealerGroup], [DeliveryTimeDealerPreferred], [DeliveryTimeFacingPdc], [DeliveryTimeTotalPaccar], [DmsDealerId], [DmsEndpointId], [DmsTypeCode], [FleetCustomerCode], [Guid], [CultureCode], [LogoAssetSequential], [LogoUrl], [Name], [PurchaseCurrencyCode], [RowVersion], [RushOrder], [SalesCurrencyCode]);
GO
CREATE NONCLUSTERED INDEX [IX_AccountCompany_Guid]
ON [dbo].[AccountCompany]([Guid] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_AccountCompany_DmsTypeCode]
ON [dbo].[AccountCompany]([DmsTypeCode] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_AccountCompany_AccountTypeCode]
ON [dbo].[AccountCompany]([AccountTypeCode] ASC);
创建表[dbo]。[AccountCompany](
[CompanyId]整数标识(1,1)不为空,
[AccountTypeCode]NVARCHAR(2)默认值('00')不为空,
[PONumberMandatoryUpstream]位为空,
[PONumberMandatoryDownstream]位为空,
约束[PK_AccountCompany]主键群集([CompanyId]ASC),
约束[FK_AccountCompany_AccountBranchType]外键([BranchTypeCode])引用[dbo]。[AccountBranchType]([BranchTypeCode]),
约束[FK_AccountCompany_AccountCustomerBusiness Segment]外键([BusinessSegment])引用[dbo]。[AccountCustomerBusiness Segment]([BusinessSegmentCode]),
约束[FK_AccountCompany_AccountDsEndpoint]外键([DsEndpointId])引用[dbo]。[AccountDsEndpoint]([DsEndpointId]),
约束[FK_AccountCompany_AccountDmsType]外键([DmsTypeCode])引用[dbo]。[AccountDmsType]([DmsTypeCode]),
约束[FK_AccountCompany_AccountType]外键([AccountTypeCode])引用[dbo]。[AccountType]([AccountTypeCode]),
约束[FK_AccountCompany_Currency_Purchase]外键([PurchaseCurrencyCode])引用[dbo]。[CurrencyCode]([CurrencyCode]),
约束[FK_AccountCompany_Currency_Sales]外键([SalesCurrencyCode])引用[dbo]。[CurrencyCode]([CurrencyCode]),
约束[FK_AccountCompany_MasterLanguage]外键([CultureCode])引用[dbo]。[MasterLanguage]([CultureCode])
);
去
创建非聚集索引[IX_AccountCompany_LocationCode_Active]
在[dbo].[AccountCompany]([LocationCode]ASC、[Active]ASC)上
包括([AccountTypeCode]、[BranchTypeCode]、[DeliveryTimeDealerGroup]、[DeliveryTimeDealerPreferred]、[DeliveryTimePacdC]、[DeliveryTimeTotalPaccar]、[DMSDalerID]、[DmsTypeCode]、[FleetCustomerCode]、[Guid]、[CultureCode]、[LogoAssetSequential]、[LogoUrl]、[Name]、[PurchaseCurrencCode]、[RowVersion],[RushOrder],[SalesCurrencyCode];
去
创建非聚集索引[IX_AccountCompany_Guid]
在[dbo].[AccountCompany]([Guid]ASC)上;
去
创建非聚集索引[IX_AccountCompany_DmsTypeCode]
在[dbo].[AccountCompany]([DmsTypeCode]ASC)上;
去
创建非聚集索引[IX_AccountCompany_AccountTypeCode]
在[dbo].[AccountCompany]([AccountTypeCode]ASC)上;
最后两列PONumberMandatoryUpstream和PONumberMandatoryDownstream可能会导致表重建。这两列都是新的,都添加到表的末尾,没有外键/约束/索引。如果我手动与架构比较进行比较,我只会看到一个ALTER table ADD COLUMN语句,它不会重建ta可悲的。
出于某种原因,自动部署决定表需要重建
有人知道为什么SSDT认为表需要重建吗
我的第一个猜测可能与发布xml文件中的设置有关。我尝试将这些设置与架构比较中的设置进行比较,但似乎没有区别。
如果需要,我可以包括部署日志和发布设置文件。经过两天的调试,我发现了问题所在。结果是,我们的一位管理员启用了数据库发现和分类。这会添加一些关于表定义中特定列和分类的额外SQL语句,而这些列和分类不在数据库中每个部署都会重新生成这些表,在我们的例子中是44个表
此分类结构非常新,ssdt部署还无法在管道中处理此问题。将这些语句添加到数据库项目中不起作用,因为这样会在管道中产生类似未知语句的错误。我们唯一的选择是禁用分类,直到ssdt支持为止。您可以手动将这两列添加到数据库项目中吗然后检查SSDT是否要部署任何其他更改?