web-dev-qa-db-fra.com

Comment supprimer toutes les tables et réinitialiser une base de données Azure SQL

J'ai un projet ASP.NET MVC 5 qui fonctionne en local et chaque fois que j'ai besoin de supprimer la base de données, je viens d'ouvrir une nouvelle requête, de modifier le menu déroulant de la base de données disponible en maître, puis de fermer la connexion sur ma base de données locale et d'exécuter le requête "déposer la base de données [nom]". Ensuite, je construis le projet, je vais dans la console du gestionnaire de paquets et lance "Update-Database". Cela semble reconstruire une nouvelle base de données locale et exécuter la méthode de départ dans mon fichier configuration.cs.

Le problème, c’est lorsque j’ai besoin de tester des éléments dans un environnement en direct pour pouvoir tester les API. Par exemple, je vais effectuer un déploiement sur un site Web Azure et la base de données Azure associée, ce qui est simple et facile à faire. Je coche la case "Exécuter les premières migrations de code" dans l'assistant de publication et la plupart du temps, cela fonctionne et je peux exécuter et déboguer ma version en direct. Parfois, j'ai besoin de supprimer cette base de données et de recommencer à zéro, mais la seule façon de le faire consiste à accéder au portail Azure, à supprimer la base de données, puis à la recréer avec le même nom. Azure met un certain temps à traiter. Le cycle de test est donc lent.

Existe-t-il un moyen rapide de supprimer/réinitialiser une base de données SQL Azure sur son état vierge, vide et vierge, puis de republier avec "exécuter le code des premières migrations" pour qu'il recrée les tables et réensemence les données ?

J'ai déjà entendu parler de créer une migration initiale après avoir créé la base de données, puis d'essayer d'utiliser Powershell pour effectuer une sorte de retour à l'état initial, mais je n'ai pas eu la chance de le faire fonctionner, et Je veux supprimer toutes les données en même temps. Peut-être que je viens d'avoir la mauvaise syntaxe ou de ne pas avoir trouvé un bon tutoriel. Bien que je puisse exécuter une requête sur la base de données Azure pour "supprimer la base de données [x]", elle tue littéralement l'instance de base de données SQL Azure comme vous le souhaitiez et vous devez revenir dans le portail pour la recréer. Parfois, cet état initial n’est pas bon car le modèle a été mis à jour depuis, de sorte que cela peut ne pas être utile de toute façon.

Je pense qu'il devrait exister un moyen plus simple et plus rapide de tester les modifications sur un environnement réel, grâce à tous ces outils et raccourcis fournis par MS, mais ont-ils tout simplement laissé tomber la balle ici pour cette phase de développement ou est-ce que je manque quelque chose?

38
Ivan

Comme je ne suis au courant d'aucune méthode d'API pour ce faire, nous avons utilisé ce script pour exploiter une requête T-SQL afin d'effacer la base de données

Pour supprimer chaque table (et conserver vos historiques de migration EF si vous le souhaitez)

while(exists(select 1 from INFORMATION_SCHEMA.TABLES 
             where TABLE_NAME != '__MigrationHistory' 
             AND TABLE_TYPE = 'BASE TABLE'))
begin
 declare @sql nvarchar(2000)
 SELECT TOP 1 @sql=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME
 + ']')
 FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_TYPE = 'BASE TABLE'
exec (@sql)
 /* you dont need this line, it just shows what was executed */
 PRINT @sql
end

Pour supprimer les clés étrangères en premier si vous devez

while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
 declare @sql nvarchar(2000)
 SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME
 + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
 FROM information_schema.table_constraints
 WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
 exec (@sql)
 PRINT @sql
end

Dans mes tests, cela fonctionnait sans problème (sauf que je n'avais pas la clause where dans DROP TABLE pendant la requête, car je n'utilise pas les migrations Code First ou EF).

41
Tommy

Il suffit d’ajouter aux réponses, car la réponse acceptée ne fonctionnait pas pour moi sur Azure . Utilisez le script ci-dessous pour supprimer toutes les tables et réinitialiser la base de données Azure. les tables.

Comme @Skorunka František a commenté ce script, supposons que vous utilisiez le schéma par défaut [dbo]. Bien que vous puissiez le remplacer par votre propre nom de schéma.

/* Azure friendly */
/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

Malheureusement, je ne trouve plus la source de ce code, car je l’avais sauvegardé dans l’un de mes référentiels ... J'espère que cela aidera quelqu'un.

38
Gizmo3399

D'habitude je 

  1. ouvrir SQL Server Management Studio ou à partir de Visual Studio ouvrir SQL Server Object Explorer
  2. Je me connecte à Azure SQL Server (i.e: yourserver.database.windows.net avec votre nom d'utilisateur et votre mot de passe pour l'option d'authentification SQL Server sélectionnés) (n'oubliez pas qu'il vous faudra ajouter une exception de pare-feu dans le portail Azure pour vous connecter de cette manière à votre base de données).
  3. Faites un clic droit sur la base de données et supprimez-le. 

Aussi simple que cela.

Ensuite, puisque vous avez indiqué que vous utilisiez une approche de migration par code d'abord, il vous suffit de réexécuter les migrations dans Azure SQL Server (par exemple, lors de la publication, assurez-vous de cocher l'option d'appliquer les migrations pour la chaîne de connexion du serveur SQL donnée).

En général, je supprime la base de données distante, puis je redéploie l'application avec la commande permettant de réexécuter les migrations. Cela créera à nouveau la base de données avec les nouvelles tables. Le code pour initialiser la base de données est dans mon code de démarrage afin qu'il soit initialisé chaque fois que l'application est initialisée s'il n'y a aucune valeur dans la base de données.

Ceci est également valable pour AspNet Core Mvc (MVC6)

5
iberodev

Juste pour ajouter ma variante au mixage ... Celui-ci prend également en compte les vues et les tables externes. Cela ne se produira pas sur les tables externes qui doivent être retirées séparément avec DROP EXTERNAL TABLE. Cela a causé la version originale à tourner pour toujours.

while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
 declare @sql nvarchar(2000)
 SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME
 + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
 FROM information_schema.table_constraints
 WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
 exec (@sql)
 PRINT @sql
end


while(exists(select 1 from INFORMATION_SCHEMA.TABLES 
    where TABLE_NAME != 'database_firewall_rules' 
    AND TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME NOT IN (select name from sys.external_tables)))
begin
 declare @sql1 nvarchar(2000)
 SELECT TOP 1 @sql1=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
 FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_NAME != 'database_firewall_rules'
    AND TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME NOT IN (select name from sys.external_tables)
exec (@sql1)
 PRINT @sql1
end
2
Nich Overend

Azure SQL est essentiellement un serveur SQL. Vous pouvez donc utiliser MS SQL Server Management Studio https://docs.Microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Ouvrez la base de données dans Management Studio à l'aide de votre compte administrateur, puis exécutez les commandes SQL de suppression de table ou utilisez le menu contextuel de l'interface graphique pour faire ce que vous voulez, comme si vous utilisiez une base de données locale.

Une opération similaire peut être réalisée dans l'Explorateur d'objets Visual Studio SQL Server. Juste un clic droit sur la racine "Ajouter un serveur SQL".

0
Serena Yu