web-dev-qa-db-fra.com

Colonne de dépôt du projet de base de données Visual Studio 2013

Quelqu'un connaît-il la meilleure façon de supprimer une colonne existante de la base de données lorsqu'il y a des lignes de données dans la table de données?.

Ce que j'ai essayé ne semble pas vouloir fonctionner. J'ai inclus un script de pré-déploiement avec le projet de base de données

GO
if exists(select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Mercury.dbo.Discounts' and COLUMN_NAME = 'ColumnToRemove')
BEGIN
    ALTER TABLE Database.dbo.Table1 Drop Column ColumnToRemove
END
GO

Ensuite, dans le script qui a créé la table en premier lieu, j'ai supprimé la colonne en question du script de création de table

Lorsque l'exécution du dacpac a été effectuée, j'obtiens ce qui suit

Initializing deployment (Start)
*** The column [dbo].[Table1].[ColumnToRemove] is being dropped, data loss could occur.
Initializing deployment (Complete)
Analyzing deployment plan (Start)
Analyzing deployment plan (Complete)
Updating database (Start)
An error occurred while the batch was being executed.
Updating database (Failed)
*** Could not deploy package.
Warning SQL72015: The column [dbo].[Table1].[ColumnToRemove] is being dropped, data loss could occur.
Error SQL72014: .Net SqlClient Data Provider: Msg 50000, Level 16, State 127, Line 6 Rows were detected. The schema update is terminating because data loss might occur.
Error SQL72045: Script execution error.  The executed script:
IF EXISTS (SELECT TOP 1 1
           FROM   [dbo].[Table1])
    RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127)
        WITH NOWAIT;    
36
DRobertE

Je sais que c'est un vieux fil, mais je suis tombé sur celui-ci quand j'étais confronté au même problème .. Quelqu'un pourrait quand même en bénéficier ..

Voici ce qui a fonctionné pour moi:

Lorsque vous cliquez avec le bouton droit sur le projet DB dans VS, vous obtenez la boîte de dialogue "Publier la base de données". Vous configurez la connexion au serveur cible et choisissez la base de données appropriée.

Cliquez ensuite sur le bouton "Avancé ..." pour ouvrir les "Paramètres de publication avancés".

1) Uncheck - 'Block incremental deployment if data loss might occur' checkbox.
2) Check - 'DROP objects in target but not in project'

Cliquer sur OK bouton. Cliquez ensuite sur Generate Script pour que le script de publication soit généré.

Vous pouvez enregistrer ces paramètres dans un fichier de profil si vous souhaitez générer fréquemment le script.

50
beastieboy

Vous devez modifier les propriétés du projet de base de données

  1. Accédez aux propriétés du projet
  2. Onglet de débogage
  3. supprimer la coche de cette option "Bloquer le déploiement incrémentiel en cas de perte de données" comme dans l'image ci-dessous

23
feras damra

Dans ma situation ...

Utilisation de la comparaison de schémas dans Visual Studio 2015. Une fois la fenêtre de comparaison de schémas ouverte:

  1. Options de comparaison de schéma (la petite icône d'engrenage dans la bande de menu).
  2. Accédez à l'onglet Général
  3. Décochez Bloquer en cas de perte de données possible

Cela reste non vérifié pour la durée de la session. Je n'ai pas confirmé s'il reste vérifié ou non lorsque vous quittez la session.

3
Scooter

Si vous ne pouvez pas décocher "Bloquer le déploiement incrémentiel en cas de perte de données" pour des raisons liées au projet, vous pouvez créer un script de pré-déploiement et de post-déploiement pour activer la transformation. Cela devient beaucoup plus complexe que ci-dessous si vous avez des dépendances sur l'une des colonnes de la table mise à niveau.

Exemple de script de pré-déploiement:

IF EXISTS (SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'YourSchema'
    AND TABLE_NAME = 'YourTable'
    AND COLUMN_NAME = 'ColumnToBeDropped')
BEGIN

    CREATE TABLE [Upgrade].[YourTable](
        [YourTableId] [int] NOT NULL,
        [KeepThisColumn] [money] NOT NULL)

    INSERT INTO Upgrade.YourTable
    (YourTableId, KeepThisColumn)
    SELECT YourTableId, KeepThisColumn
    FROM YourSchema.YourTable

    TRUNCATE TABLE YourSchema.YourTable

END

Ensuite, le projet de base de données supprimera la colonne à supprimer de votre base de données.

Vous aurez besoin d'un script de post-déploiement pour retransférer les données dans la vraie table. Exemple de script de post-déploiement:

IF EXISTS (SELECT *
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'Upgrade'
    AND TABLE_NAME = 'YourTable')
BEGIN

    SET IDENTITY_INSERT YourSchema.YourTable ON

    INSERT INTO YourSchema.YourTable
    (YourTableId, KeepThisColumn)
    SELECT YourTableId, KeepThisColumn
    FROM Upgrade.YourTable

    SET IDENTITY_INSERT YourSchema.YourTable OFF

    DROP TABLE Upgrade.YourTable

END
2
Giles Roberts

Vous ne devez le faire qu'une seule fois dans le projet (pas dans le script de pré-déploiement) et lorsque vous publiez, vous devrez le faire avec l'option "autoriser la perte de données". Je ne vois pas de moyen de contourner une éventuelle perte de données si vous supprimez une colonne. Vous pouvez toujours modifier ce paramètre une fois cette opération effectuée.

0
Peter Schott