web-dev-qa-db-ja.com

すべてのテーブルを削除してAzure SQL Databaseをリセットする方法

ローカルで動作するASP.NET MVC 5プロジェクトがあり、DBを吹き飛ばす必要があるときはいつでも、それに対して新しいクエリを開き、使用可能なデータベースのドロップダウンをマスターに変更し、ローカルdbの接続を閉じて実行しますクエリ「drop database [name]」。次に、プロジェクトをビルドし、パッケージマネージャーコンソールに移動して、「Update-Database」を実行します。これにより、新しいローカルデータベースが再構築され、configuration.csファイルでシードメソッドが実行されるようです。

問題は、ライブ環境で物事をテストする必要があるときです。そうすれば、APIをテストできるようになります。AzureWebサイトとそれに付随するAzure DBへのデプロイを行います。パブリッシュウィザードの[コードを最初に移行する]チェックボックスをオンにし、ほとんどの場合は動作し、ライブバージョンを実行およびデバッグできます。時々、そのデータベースを吹き飛ばして、ゼロからやり直す必要がありますが、私が本当に見つけた唯一の方法は、Azureポータルに移動してデータベースを削除し、同じ名前で再作成することです。 Azureの処理には時間がかかるため、テストサイクルは遅くなります。

Azure SQL DBを新しい空の未使用の状態にドロップ/リセットし、「コードファーストマイグレーションの実行」で再発行してテーブルを再作成し、再シードする簡単な方法はありますかデータ?

Dbを作成した後に初期移行を作成し、Powershellを使用してその初期状態に何らかのロールバックを試みるという話を見てきましたが、それを機能させることができませんでした。すべてのデータを同時に削除したい。たぶん、間違った構文を持っているか、十分なチュートリアルが見つかりませんでした。 Azure DBでクエリを実行して "データベース[x]を削除"することはできますが、期待どおりにSQL Azure DBインスタンスを強制終了し、ポータルに戻って再作成する必要があります。モデルが更新されてから、その初期状態が役に立たない場合があるため、これはとにかく役に立たないかもしれません。

MSが提供するこれらの優れたツールとショートカットはすべて存在するため、ライブ環境で変更をテストするより簡単な方法があるはずですが、開発のこの段階でボールをドロップしただけですか、何か不足していますか?

43
Ivan

私が知っているこれを行うAPIの方法がないため、 このスクリプトを使用してT-SQLクエリを活用してデータベースをクリアします を使用しました。

各テーブルを削除する(必要に応じてEF移行履歴を維持する)

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

必要な場合に最初に外部キーを削除するには

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

私のテストでは、これは問題なく機能しました(Code FirstまたはEFの移行を使用しないため、クエリ中にDROP TABLEにwhere句がなかったことを除く)。

54
Tommy

Azureで受け入れられた回答が機能しなかったため、回答に追加するだけです。以下のスクリプトを使用して、すべてのテーブルを削除し、基本的にAzureデータベースをリセットします。最初にすべての制約を削除してから、すべてのテーブルを削除します。

@SkorunkaFrantišekがコメントしたように、このスクリプトはデフォルトの[dbo]スキーマを使用すると仮定しています。独自のスキーマ名に置き換えることもできますが。

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

悲しいことに、リポジトリの1つに保存していたため、このコードのソースはもう見つかりません。私はそれが誰かを助けることを願っています。

45
Gizmo3399

私は通常

  1. sQL Server Management Studioを開くか、Visual StudioからSQL Server Object Explorerを開きます
  2. Azure SQL Serverに接続します(つまり:yourserver.database.windows.net選択したSQL Server認証オプションのユーザー名とパスワード)(また、この方法でPCからデータベースに接続するには、Azureポータルにファイアウォール例外を追加する必要があることに注意してください)
  3. データベースを右クリックして削除します。

それと同じくらい簡単です。

次に、コードファーストの移行アプローチがあると述べたので、Azure SQL Serverで移行を再度実行するだけです(たとえば、公開時に、指定されたSQLサーバー接続文字列に移行を適用するオプションを確認してください)

通常、リモートデータベースを削除してから、移行を再実行するコマンドを使用してアプリケーションを再デプロイします。これにより、新しいテーブルを使用してデータベースが再度作成されます。データベースをシードするコードは、スタートアップコードに含まれているため、DBに値がない場合にアプリが初期化されるたびにシードされます。

これは、AspNet Core Mvc(MVC6)にも有効です。

6
iberodev

バリアントをミックスに追加するだけです...これは、ビューと外部テーブルも考慮に入れます。 DROP EXTERNAL TABLEを使用して個別に削除する必要がある外部テーブルでは、バーフは行われません。これにより、元のバージョンが永久にスピンしました。

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
4
Nich Overend

Azure SQLは基本的にSQLサーバーです。 MS SQL Server Management Studioを使用できます https://docs.Microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

管理者アカウントを使用してManagement Studioでデータベースを開き、ドロップテーブルSQLコマンドを実行するか、GUIの右クリックメニューを使用して、ローカルデータベースを使用するのと同じように必要な操作を行います。

Visual Studio SQL Serverオブジェクトエクスプローラーでも同様のことができます。ルート「SQLサーバーの追加」を右クリックします。

1
Serena Yu