Jak usunąć wszystkie tabele i zresetować bazę danych Azure SQL

Mam ASP.NET projekt MVC 5, który działa lokalnie i kiedy muszę zdmuchnąć DB, po prostu otwieram nowe zapytanie na nim, zmieniam listę rozwijaną dostępną bazę danych na master, następnie zamykam połączenie na moim lokalnym db i uruchamiam zapytanie " drop database [name]". Następnie buduję projekt, wchodzę do konsoli Menedżera pakietów i uruchamiam "Update-Database". To wygląda na odbudowanie świeżej lokalnej bazy danych i uruchomienie metody seed w mojej konfiguracji.plik cs.

Problem polega na tym, że muszę przetestować rzeczy w środowisku na żywo, więc mogę przetestować API i takie lepsze, zrobię wdrożenie na witrynie Azure i towarzyszącej Azure DB, co jest miłe i łatwe do zrobienia. Zaznaczam "wykonaj pierwsze migracje kodu" w kreatorze publikowania i przez większość czasu działa i mogę uruchomić i debugować moją wersję NA ŻYWO. Czasami muszę zdmuchnąć tę bazę danych i zacząć od nowa, ale jedynym sposobem, który naprawdę znalazłem, aby to zrobić, jest przejście do portalu Azure, usunięcie bazy danych, a następnie ponowne utworzenie jej za pomocą to samo imię. Proces ten zajmuje trochę czasu platformie Azure, więc jest to powolny cykl testowania.

Czy istnieje szybki sposób, aby po prostu upuścić / zresetować bazę danych usługi Azure SQL DB do stanu świeżego, pustego i pierwotnego, a następnie ponownie opublikować za pomocą opcji "wykonaj pierwsze migracje kodu", aby ponownie utworzyć tabele i ponownie zasiać dane?

Widziałem kilka rozmów o tworzeniu początkowej migracji po utworzeniu db, a następnie próbuje użyć Powershell zrobić jakiś rodzaj powrotu do tego stanu początkowego, ale nie miałem szczęścia, aby to działało i chcę usunąć wszystkie dane w tym samym czasie. Może po prostu mam złą składnię lub nie znalazłem wystarczająco dobrego tutoriala. Podczas gdy mogę uruchomić zapytanie na platformie Azure DB, aby "upuścić bazę danych [x]", dosłownie zabija instancję SQL Azure DB, jak można się spodziewać i musisz wrócić do portalu, aby ją odtworzyć. Czasami ten stan początkowy nie jest dobry, ponieważ model został zaktualizowany, więc może to i tak nie być przydatne.

Czuję, że powinno być jakiś łatwiejszy sposób na testowanie zmian w środowisku na żywo, ponieważ są tam wszystkie te świetne narzędzia i skróty dostarczane przez MS, ale czy oni po prostu rzucili piłkę tutaj na tę fazę rozwoju, czy coś mi umyka?

Author: Joseph Idziorek, 2016-01-23

6 answers

Ponieważ nie jest do tego znany mi sposób API, użyliśmy tego skryptu, aby wykorzystać zapytanie T-SQL do wyczyszczenia bazy danych .

Aby usunąć każdą tabelę (i zachować historię migracji EF, jeśli chcesz)

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

Aby usunąć klucze obce najpierw, jeśli trzeba

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

W moich testach działało to bez problemów (z wyjątkiem tego, że nie miałem klauzuli where w tabeli DROP while query, ponieważ nie używam najpierw kodu lub migracji EF).

 30
Author: Tommy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-16 09:19:22

Po prostu dodać do odpowiedzi, ponieważ zaakceptowana odpowiedź nie działa dla mnie na Azure. Użyj poniższego skryptu, aby usunąć wszystkie tabele i zasadniczo zresetować bazę danych platformy azure. Najpierw usuwa wszystkie ograniczenia, a następnie usuwa wszystkie tabele.

Jak skomentował @ Skorunka František ten skrypt zakłada użycie domyślnego schematu [dbo]. Chociaż można zastąpić go własną nazwą schematu.

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

Niestety nie mogę już znaleźć źródła tego kodu, ponieważ zapisałem go w jednym z moje repozytoria. Mam nadzieję, że to komuś pomoże.

 34
Author: Gizmo3399,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 08:49:50

I zwykle

  1. open SQL Server Management Studio lub z Visual Studio open SQL Server Object Explorer
  2. łączę się z serwerem Azure SQL Server (tzn.: yourserver.database.windows.net z wybraną opcją uwierzytelniania serwera SQL przy użyciu nazwy użytkownika i hasła) (Pamiętaj również, że aby połączyć się z komputerem z bazą danych w ten sposób, musisz dodać wyjątek zapory sieciowej w portalu Azure)
  3. Kliknij prawym przyciskiem myszy bazę danych i usuń.
To takie proste.

Then, ponieważ wspomniałeś, że masz podejście do pierwszej migracji kodu, po prostu uruchom migracje ponownie w Azure SQL Server (na przykład podczas publikowania upewnij się, że zaznaczyłeś opcję Zastosuj migracje dla danego ciągu połączenia sql server)

Zazwyczaj usuwam zdalną bazę danych, a następnie ponownie wdrażam aplikację za pomocą polecenia, aby ponownie uruchomić migracje. Spowoduje to ponowne utworzenie bazy danych z nowymi tabelami. Kod do zalania bazy danych jest w moim kodzie startowym, więc jest zalany za każdym razem, gdy aplikacja jest inicjalizowana, jeśli nie ma wartości w DB.

Jest to również ważne dla AspNet Core Mvc (MVC6)
 5
Author: iberodev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-06 23:37:20

Żeby dodać mój wariant do miksu... Ten uwzględnia również widoki i tabele zewnętrzne. Nie będzie rzygać na zewnętrznych stołach, które muszą być usunięte oddzielnie z DROP EXTERNAL TABLE. To spowodowało, że Oryginalna wersja kręciła się na zawsze.

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
Author: Nich Overend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-16 18:12:18

Azure SQL to zasadniczo SQL server. Więc możesz użyć MS SQL Server Management Studio https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Otwórz bazę danych w Management Studio za pomocą konta administratora, a następnie wykonaj polecenia SQL drop table lub użyj menu prawym przyciskiem myszy GUI, aby zrobić, co chcesz, tak jak przy użyciu lokalnej bazy danych.

Podobne rzeczy można zrobić w Visual Studio SQL Server Object Explorer. Wystarczy kliknąć prawym przyciskiem myszy root "Add SQL server".

 0
Author: Serena Yu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-08 05:20:43

Alternatywnie, możesz upuścić bazę danych w C# i utworzyć nową bazę danych za pomocą ExecuteNonQuery .

queryString = "DROP DATABASE TestDB2";

SqlCommand command = new SqlCommand(queryString, connection);
        command.Connection.Open();
        command.ExecuteNonQuery();

Gdzie connection jest połączeniem z główną bazą danych Azure SQL Database.

Alternatywnie, aby utworzyć bazę danych:

queryString = "CREATE DATABASE TestDB2 ( EDITION = 'standard' )";
 -1
Author: Joseph Idziorek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-26 14:10:43