SSDT 在没有任何更改时删除并重新创建表

问题描述 投票:0回答:2

我正在使用 SSDT 数据库项目为我的数据库创建部署脚本。
每次部署运行时,都会删除其中一个表 [AdrInfo].[IL],然后重新创建。
项目文件中表的定义没有任何变化。
表的定义:

CREATE TABLE [AdrInfo].[IL] (
        [IL_ID]      NVARCHAR (50) NULL,
        [IL_ADI]     NVARCHAR (50) NULL,
        [XCOOR]      VARCHAR (50)  NULL,
        [YCOOR]      VARCHAR (50)  NULL,
        [IL_ADI_KEY] AS            (CONVERT (NVARCHAR (255), replace(replace([IL_ADI], ' ', ''), '.', ''), 0) COLLATE SQL_Latin1_General_Cp850_CI_AI) PERSISTED );

CREATE CLUSTERED INDEX [index_IX_IL_CI1] ON [AdrInfo].[IL]([IL_ADI_KEY] ASC);

部署脚本的片段:


    GO PRINT N'Starting rebuilding table [AdrInfo].[IL]...';


    GO BEGIN TRANSACTION;

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

    SET XACT_ABORT ON;

    CREATE TABLE [AdrInfo].[tmp_ms_xx_IL] (
        [IL_ID]      NVARCHAR (50) NULL,
        [IL_ADI]     NVARCHAR (50) NULL,
        [XCOOR]      VARCHAR (50)  NULL,
        [YCOOR]      VARCHAR (50)  NULL,
        [IL_ADI_KEY] AS            (CONVERT (NVARCHAR (255), replace(replace([IL_ADI], ' ', ''), '.', ''), 0) COLLATE SQL_Latin1_General_Cp850_CI_AI) PERSISTED );

    CREATE CLUSTERED INDEX [tmp_ms_xx_index_IX_IL_CI1]
        ON [AdrInfo].[tmp_ms_xx_IL]([IL_ADI_KEY] ASC);

我希望 SSDT 在部署期间不会触及该表。什么会导致这种行为?

sql sql-server database publish database-project
2个回答
1
投票

SSDT 在为表列部署默认表达式时非常挑剔。
请比较以下表达式:

 (CONVERT (NVARCHAR (255), replace(replace([IL_ADI], ' ', ''), '.', ''), 0)  COLLATE SQL_Latin1_General_Cp850_CI_AI) PERSISTED 
((CONVERT (NVARCHAR (255), replace(replace([IL_ADI], ' ', ''), '.', ''), 0)) COLLATE SQL_Latin1_General_Cp850_CI_AI) PERSISTED 

使用第一个将导致每次都重新部署表,使用第二个将停止此行为。 SQL Server 不将默认表达式存储为文本,而是对其进行规范化。 SSDT 使用自己的标准化,然后将其与标准化表达进行比较。
如果两组规范化规则没有创建相同的表达式,SSDT 每次都会重新部署列表达式,这会导致在您的情况下重新部署表。
为了避免这种情况,请使用 SSMS 脚本表获取标准化表达式并将其保存在项目文件中。


0
投票

尝试检查源和目标中列的顺序。列顺序的差异被视为更改并尝试重新部署。要禁止这样做,您可以选中“发布配置文件 - 高级 - 忽略 - 忽略列顺序”下的选项。

© www.soinside.com 2019 - 2024. All rights reserved.