如何强制Microsoft数据库项目为主键约束生成ALTER语句而不是创建临时表?

时间:2017-03-20 19:35:31

标签: sql sql-server visual-studio sql-server-data-tools database-project

我有以下LoginLogo表的脚本:

CREATE TABLE [LoginLogo] (
    [LoginLogoId]           INT               IDENTITY (1, 1) NOT NULL,
    [LoginId]               INT               NOT NULL,
    [LogoNm]                NVARCHAR(255)     NULL,
    CONSTRAINT [PK_LoginLogo_LoginLogoId] PRIMARY KEY CLUSTERED ([LoginId] ASC),
    CONSTRAINT [FK_LoginLogo_LoginId] FOREIGN KEY ([LoginId]) 
    REFERENCES [Login] ([LoginId])
);

GO
CREATE NONCLUSTERED INDEX [IF_LoginLogo_LoginId]
    ON [LoginLogo]([LoginId] ASC)
    ON [INDX];

我需要更改主键约束,所以我刚刚更改了一行,请参阅下面的更改:

CONSTRAINT [PK_LoginLogo_LoginLogoId] PRIMARY KEY CLUSTERED ([LoginLogoId] ASC),

数据库项目完美地构建了更改的代码,但是当它生成数据库更新语句时,它会生成临时表而不是简单的ALTER语句。见下面生成的脚本:

CREATE TABLE [tmp_ms_xx_LoginLogo] (
    [LoginLogoId]        INT            IDENTITY (1, 1) NOT NULL,
    [LoginId]            INT            NOT NULL,
    [LogoNm]             NVARCHAR (255) NULL,
    CONSTRAINT [tmp_ms_xx_constraint_PK_LoginLogo_LoginLogoId1] 
    PRIMARY KEY CLUSTERED ([LoginLogoId] ASC)
);

IF EXISTS (SELECT TOP 1 1 
           FROM   [apps].[LoginLogo])
    BEGIN
        SET IDENTITY_INSERT [apps].[tmp_ms_xx_LoginLogo] ON;
        INSERT INTO [apps].[tmp_ms_xx_LoginLogo] ([LoginLogoId], [LoginId], [LogoNm])
        SELECT   [LoginLogoId],
                 [LoginId],
                 [LogoNm],
        FROM     [LoginLogo]
        ORDER BY [LoginLogoId] ASC;
        SET IDENTITY_INSERT [tmp_ms_xx_LoginLogo] OFF;
    END

DROP TABLE [LoginLogo];

EXECUTE sp_rename N'[tmp_ms_xx_LoginLogo]', N'LoginLogo';

EXECUTE sp_rename N'[tmp_ms_xx_constraint_PK_LoginLogo_LoginLogoId1]',
N'PK_LoginLogo_LoginLogoId', N'OBJECT';

是否可以告诉Database项目生成ALTER语句而不是创建临时表?如何强制Microsoft数据库项目执行此操作?

1 个答案:

答案 0 :(得分:3)

请记住,如果更改表的聚簇索引,则无论脚本是否执行ALTER TABLE或SSDT生成的具有临时表的内容,都将重建该表解决这些问题的常用方法是提前ALTER

意思是,您需要一个脚本,通常称为预部署之前的脚本(预部署不会工作,因为它在比较后运行)会产生昂贵的更改,因此当比较运行已发生变化,因此dacpac部署不会重复。

在执行任何sqlpackage内容之前,需要将此脚本作为部署的一部分运行。您可以在此脚本中将更改指定为alter table

在这个特定的实例中,无论哪种方式都要重建表,我都看不到它对整个部署时间产生很大的影响。