web-dev-qa-db-de.com

So löschen Sie alle Tabellen und setzen eine Azure SQL-Datenbank zurück

Ich habe ein ASP.NET MVC 5-Projekt, das lokal funktioniert, und wenn ich die Datenbank wegblasen muss, öffne ich einfach eine neue Abfrage, ändere die verfügbare Datenbank-Dropdown-Liste in master, schließe dann die Verbindung auf meiner lokalen Datenbank und führe das aus Abfrage "Datenbank löschen [Name]". Dann erstelle ich das Projekt, gehe in die Paket-Manager-Konsole und starte "Update-Database". Dies scheint eine neue lokale Datenbank neu zu erstellen und führt die Seed-Methode in meiner Datei configuration.cs aus.

Das Problem ist, wenn ich Dinge in einer Live-Umgebung testen muss, damit ich APIs testen kann, und ich werde sie besser auf einer Azure-Website und der dazugehörigen Azure DB bereitstellen, was nett und einfach ist. Ich überprüfe die Option "Code zuerst Migration ausführen" im Veröffentlichungsassistenten und meistens funktioniert es, und ich kann meine Live-Version ausführen und debuggen. Manchmal muss ich die Datenbank wegblasen und wieder von vorne anfangen, aber die einzige Möglichkeit, die ich wirklich gefunden habe, ist, in das Azure-Portal zu gehen, die Datenbank zu löschen und sie unter demselben Namen neu zu erstellen. Dies dauert einige Zeit, bis Azure verarbeitet werden kann. Dies ist also ein langsamer Testzyklus.

Gibt es eine schnelle Möglichkeit, eine Azure SQL-Datenbank einfach in den neuen, leeren, unberührten Zustand zu ziehen/zurückzusetzen und sie anschließend mit "Ausführen von Code zum ersten Mal ausführen" erneut zu veröffentlichen, damit die Tabellen neu erstellt und die Daten erneut erstellt werden ?

Ich habe schon einige Diskussionen über das Erstellen einer anfänglichen Migration nach dem Erstellen der Datenbankbibliothek gesehen und dann versucht, die Powershell zu verwenden, um eine Art Zurücksetzung auf diesen ursprünglichen Zustand durchzuführen, aber ich hatte kein Glück, dass es funktioniert und Ich möchte alle Daten gleichzeitig löschen. Vielleicht habe ich nur die falsche Syntax oder habe kein gutes Tutorial gefunden. Während ich eine Abfrage in der Azure DB ausführen kann, um die Datenbank [x] zu löschen, wird die SQL Azure DB-Instanz wie erwartet beendet, und Sie müssen das Portal erneut aufrufen, um sie neu zu erstellen. Manchmal ist dieser Anfangszustand nicht gut, da das Modell seitdem aktualisiert wurde. Daher ist dies möglicherweise ohnehin nicht hilfreich.

Ich denke, es sollte einen schnelleren Weg geben, Änderungen in einer Live-Umgebung zu testen, da all diese großartigen Tools und Abkürzungen von MS zur Verfügung stehen. Aber haben sie den Ball für diese Entwicklungsphase einfach fallen gelassen oder fehlt mir etwas?

38
Ivan

Da es hierfür keine API-Methode gibt, die mir bekannt ist, haben wir dieses Skript verwendet, um eine T-SQL-Abfrage zum Löschen der Datenbank zu nutzen

So löschen Sie jede Tabelle (und pflegen Sie ggf. Ihre EF-Migrationshistorien)

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

Fremdschlüssel zuerst entfernen, wenn Sie müssen

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

In meinem Test funktionierte dies ohne Probleme (außer, dass ich während der Abfrage die where-Klausel in der DROP TABLE nicht hatte, da ich keine Code First- oder EF-Migrationen verwende).

41
Tommy

Einfach zu den Antworten hinzufügen, da die akzeptierte Antwort für mich in Azure nicht funktioniert hat .. Verwenden Sie das unten stehende Skript, um alle Tabellen zu löschen und die Azure-Datenbank im Wesentlichen zurückzusetzen. Sie löscht zunächst alle Einschränkungen und löscht dann alle die Tische.

Da @Skorunka František kommentierte, setzt dieses Skript voraus, dass Sie das Standardschema [dbo] verwenden. Sie könnten es jedoch durch Ihren eigenen Schemanamen ersetzen.

/* 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

Leider kann ich den Quellcode für diesen Code nicht mehr finden, da ich ihn in einem meiner Repositorys gespeichert hatte ... Ich hoffe, es hilft jemandem.

38
Gizmo3399

Ich für gewöhnlich 

  1. Öffnen Sie SQL Server Management Studio oder aus Visual Studio den SQL Server-Objekt-Explorer
  2. Ich verbinde mich mit dem Azure SQL Server (d. H .: yourserver.database.windows.net mit ausgewähltem Benutzernamen und Kennwort für die SQL Server-Authentifizierungsoption). (Denken Sie auch daran, dass Sie eine Firewall-Ausnahme im Azure-Portal hinzufügen müssen, um auf diese Weise von Ihrem PC eine Verbindung zur Datenbank herzustellen.
  3. Klicken Sie mit der rechten Maustaste auf die Datenbank und löschen Sie sie. 

So einfach ist das.

Da Sie erwähnt haben, dass Sie einen Code-First-Migrationsansatz haben, führen Sie die Migrationen einfach erneut in Azure SQL Server aus. Aktivieren Sie zum Beispiel bei der Veröffentlichung die Option zum Übernehmen von Migrationen für die angegebene SQL Server-Verbindungszeichenfolge.

Normalerweise lösche ich die entfernte Datenbank und stelle die Anwendung anschließend erneut mit dem Befehl zum erneuten Ausführen der Migrationen bereit. Dadurch wird die Datenbank mit den neuen Tabellen erneut erstellt. Der Code zum Seeding der Datenbank befindet sich in meinem Startup-Code. Er wird also jedes Mal ausgesät, wenn die App initialisiert wird, wenn in der DB keine Werte vorhanden sind.

Dies gilt auch für AspNet Core Mvc (MVC6).

5
iberodev

Nur um meine Variante zum Mix hinzuzufügen ... Diese berücksichtigt auch Views und externe Tabellen. Externe Tabellen, die separat mit DROP EXTERNAL TABLE entfernt werden müssen, werden nicht ausgeschlossen. Dies führte dazu, dass die Originalversion für immer gedreht wurde.

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 ist im Wesentlichen ein SQL-Server. Sie können also MS SQL Server Management Studio verwenden https://docs.Microsoft.com/de-de/sql/ssms/download-sql-server-management-studio-ssms

Öffnen Sie die Datenbank in Management Studio mit Ihrem Administratorkonto, führen Sie dann die Drop-Table-SQL-Befehle aus oder verwenden Sie das GUI-Rechtsklickmenü, um die gewünschten Aktionen auszuführen, wie bei einer lokalen Datenbank.

Ähnliches kann in Visual Studio SQL Server Object Explorer ausgeführt werden. Klicken Sie einfach mit der rechten Maustaste auf den Stamm "Add SQL Server".

0
Serena Yu