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;
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.
Vous devez modifier les propriétés du projet de base de données
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:
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.
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
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.