我有以下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数据库项目执行此操作?
答案 0 :(得分:3)
请记住,如果更改表的聚簇索引,则无论脚本是否执行ALTER TABLE
或SSDT生成的具有临时表的内容,都将重建该表解决这些问题的常用方法是提前ALTER
意思是,您需要一个脚本,通常称为预部署之前的脚本(预部署不会工作,因为它在比较后运行)会产生昂贵的更改,因此当比较运行已发生变化,因此dacpac部署不会重复。
在执行任何sqlpackage
内容之前,需要将此脚本作为部署的一部分运行。您可以在此脚本中将更改指定为alter table
。
在这个特定的实例中,无论哪种方式都要重建表,我都看不到它对整个部署时间产生很大的影响。