web-dev-qa-db-fra.com

Publication des modifications de la base de données avec SSDT comprenant l'ajout de colonnes à la table existante à la base de données cible via le projet

Publication des modifications de la base de données avec SSDT comprenant l'ajout de colonnes à la table existante dans la base de données cible (qui a été créée précédemment via SSDT) ​​.Instead de la création d'une nouvelle base de données SSDT. En essayant d'ajouter une colonne via la table Créer un script ou via ALTER Table Script.I a été rencontré par la même erreur. Même essayé par le schéma comparer encore la table dans la base de données cible rencontrée avec la même erreur. Comment modifier les modifications apportées aux objets de base de données cible via la publication SSDT?

RaisError (N'Rows ont été détectés. La mise à jour du schéma se termine car la perte de données pourrait se produire. ', 16, 127) avec même;

J'ai essayé en vérifiant le

  1. Bloquer le déploiement incrémentiel si une perte de données pourrait survenir.

  2. Ne modifiez pas les objets répliqués.

  3. Ne modifiez pas les objets de capture de données de modification.

3
Koushik Reddy

Cela se passe parce que vous avez ajouté la colonne au milieu de la CREATE TABLE script. Cela provoque une "reconstruction de table". J'en ai parlé sur mon blog il y a quelques mois: Problèmes SSDT: Reconstructions de table

La section sur l'ordonnance de la colonne est le problème spécifique que vous avez. Dis que vous avez une table comme celle-ci:

CREATE TABLE [dbo].[Post]
(
    [Id] INT IDENTITY(1,1) NOT NULL,
    [PostType] VARCHAR(10) NOT NULL
);

Puis ajoutez une colonne au milieu de la liste de colonnes:

CREATE TABLE [dbo].[Post]
(
    [Id] INT IDENTITY(1,1) NOT NULL,
    [CommentCount] INT NULL, -- NEW COLUMN IN THE MIDDLE
    [PostType] VARCHAR(10) NOT NULL
);

Cela "reconstruit" toute la table afin de conserver les métadonnées de table sous-jacente en synchronisation entre le modèle (votre projet SSDT) ​​et la base de données cible.

La solution? Il suffit d'ajouter la colonne à la fin:

CREATE TABLE [dbo].[Post]
(
    [Id] INT IDENTITY(1,1) NOT NULL,
    [PostType] VARCHAR(10) NOT NULL
    [CommentCount] INT NULL -- NEW COLUMN AT THE END
);

Cela ne reconstruit pas la table et ne provoque donc pas une perte de données potentielle.

4
Josh Darnell