什么都没有改变时,SSDT 删除并重新创建表
SSDT Drop and Recreate Tables when nothing has changed
我正在使用 SSDT 数据库项目为我的数据库创建部署脚本。
table 之一,[AdrInfo]。[IL] 被删除,然后在每次部署运行时重新创建。
项目文件中 table 的定义没有任何变化。
table的定义:
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 在部署期间不会触及此 table。什么会导致这种行为?
SSDT 在为 table 列部署默认表达式时非常挑剔。
请比较以下表达式:
(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
使用第一个将导致 table 每次都重新部署,使用第二个将停止此行为。 SQL 服务器不将默认表达式存储为文本,而是对其进行规范化。 SSDT 使用自己的规范化,然后将其与规范化表达式进行比较。
如果两组规范化规则没有创建相同的表达式,SSDT 每次都会重新部署列表达式,这导致在您的情况下重新部署 table。
为避免这种情况,请使用 SSMS 脚本 table 获取规范化表达式并将其保存在项目文件中。
我正在使用 SSDT 数据库项目为我的数据库创建部署脚本。
table 之一,[AdrInfo]。[IL] 被删除,然后在每次部署运行时重新创建。
项目文件中 table 的定义没有任何变化。
table的定义:
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 在部署期间不会触及此 table。什么会导致这种行为?
SSDT 在为 table 列部署默认表达式时非常挑剔。
请比较以下表达式:
(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
使用第一个将导致 table 每次都重新部署,使用第二个将停止此行为。 SQL 服务器不将默认表达式存储为文本,而是对其进行规范化。 SSDT 使用自己的规范化,然后将其与规范化表达式进行比较。
如果两组规范化规则没有创建相同的表达式,SSDT 每次都会重新部署列表达式,这导致在您的情况下重新部署 table。
为避免这种情况,请使用 SSMS 脚本 table 获取规范化表达式并将其保存在项目文件中。