Как заставить Microsoft Database Project сгенерировать инструкцию ALTER для ограничения первичного ключа вместо создания временной таблицы?
У меня есть следующий скрипт для таблицы 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';
Можно ли сказать проекту базы данных сгенерировать оператор ALTER вместо создания временной таблицы? Как я могу заставить Microsoft Database Project сделать это?
1 ответ
Помните, что если вы измените кластеризованный индекс таблицы, таблица будет перестроена независимо от того, выполняет ли сценарий ALTER TABLE
или сгенерированный SSDT материал с временными таблицами, обычным способом решения этих проблем является ALTER
досрочно
Это означает, что вам нужен сценарий, часто называемый сценарием перед развертыванием (предварительное развертывание не будет работать, так как он запускается после сравнения), который вносит дорогостоящие изменения, поэтому при выполнении сравнения выполняется изменение уже произошло, и, следовательно, не повторяется при развертывании dacpac.
Этот сценарий должен быть запущен как часть вашего развертывания, прежде чем вы выполните какие-либо sqlpackage
вещи. Вы можете указать изменение как alter table
в этом сценарии.
В этом конкретном случае, когда таблица будет перестроена в любом случае, я не вижу, чтобы она сильно влияла на общее время развертывания.