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 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或启用了“阻止保存要求重新创建表的更改”选项

SQL Server修改表结构时,不允许保存更改,阻止保存要求重新创建表的更改

SSDT - 不更改用户权限,但更改表权限?

如何在 parse.com 重新创建已删除的安装表

为啥数据库中的表不能修改保存