2017-03-20 3 views
1

Je script suivant pour la table LoginLogo:Comment forcer Microsoft Database Project à générer une instruction ALTER pour la contrainte de clé primaire au lieu de créer une table temporaire?

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]; 

Je dois changer contrainte de clé primaire, donc je viens de changer une ligne, s'il vous plaît voir ci-dessous le changement:

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

projet de base de données parfaitement générer le code modifié, mais lorsqu'il génère une instruction de mise à jour de la base de données, il génère une table temporaire au lieu de la simple instruction ALTER. Voir ci-dessous le script généré:

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'; 

Est-il possible de dire au projet de base de données de générer une instruction ALTER au lieu de créer une table temporaire? Comment puis-je forcer Microsoft Database Project à le faire?

Répondre

2

Ayant à l'esprit que si vous modifiez l'index cluster d'une table, la table sera reconstruit quel que soit si le script ne ALTER TABLE ou les choses générées SSDT avec des tables temporaires, de la manière habituelle pour résoudre ces problèmes est à faire l'avance ALTER du temps

Signification, vous avez besoin d'un script, souvent appelé un script pré-pré-déploiement (pré-deploy ne fonctionnera pas, car il est exécuté après comparaison) qui rend le cher changez, de sorte que lorsque la comparaison est exécutée, le changement a déjà eu lieu, et par conséquent ne se répète pas par le déploiement dacpac.

Ce script doit être exécuté dans le cadre de votre déploiement, avant de faire l'une des choses sqlpackage. Vous pouvez spécifier la modification alter table dans ce script.

Dans ce cas particulier, où la table va être reconstruit de toute façon, je ne peux pas le voir faire une grande différence au temps de déploiement global.