SSDT 在没有任何更改时删除并重新创建表
Posted
技术标签:
【中文标题】SSDT 在没有任何更改时删除并重新创建表【英文标题】:SSDT Drop and Recreate Tables when nothing has changed 【发布时间】:2019-08-28 13:59:38 【问题描述】:我正在使用 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 在部署期间不会触及此表。什么会导致这种行为?
【问题讨论】:
粘贴一些随机代码不会产生问题。你在这里问什么,你面临的问题是什么? 您尝试过什么来解决这个问题? İt 删除并重建了一些表。 什么作用?那是一个声明;这不是一个问题。再次阅读Asking 页面,然后编辑您的帖子以符合指南。谢谢。 Hİ Larnu,我有一个数据库项目。当我在VS中构建和发布项目时,一些表被删除并重建, 好的,很好。那么有什么问题呢? 【参考方案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 脚本表获取规范化表达式并将其保存在项目文件中。
【讨论】:
以上是关于SSDT 在没有任何更改时删除并重新创建表的主要内容,如果未能解决你的问题,请参考以下文章
不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或启用了“阻止保存要求重新创建表的更改”选项
SQL Server 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或启用了“阻止保存要求重新创建表的更改”选项