2016-01-23 18 views
26

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

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

Azure SQL DBを新しく空のバージン状態にドロップ/リセットしてから、 "execute code first migrations"を再発行してテーブルを再作成し、データをシードしますか?

私はdbを作成した後、PowerShellを使ってその初期状態にある種のロールバックを実行しようとしたが、それは働くために、私は同時にすべてのデータを削除したいと思います。たぶん、私はちょうど間違った構文を持っているか、十分なチュートリアルを見つけられていないでしょう。 Azure DBで「データベースを削除する」というクエリを実行することはできますが、期待通りにSQL Azure DBインスタンスを削除するため、ポータルに戻って再作成する必要があります。モデルが更新されたため、初期状態は良くないことがあるので、これはあまり役に立ちません。

ライブ環境の変更をテストする簡単な方法があるはずですが、MSが提供するこれらのすばらしいツールやショートカットがありますが、この段階ではボールをここにドロップしたり、欠けています何か?

答えて

26

私が知っているこれを行うためのAPI方法がないので、this script to leverage a T-SQL query to clear the databaseを使用しました。

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 

に必要がある場合は、最初の外部キーを削除するには、各テーブルを削除する(そして、あなたがしたい場合は、あなたのEFの移行履歴を維持する)ために、これはなしで働いていました(コードファーストまたはEFの移行を使用していないため、DROP TABLEにwhere句がありませんでした。

+0

これはAzureでは機能しないようです。テーブルの1/8のように削除され、永遠に回転します。停止すると、いくつかの特殊テーブルを削除する権限がないというエラーが表示されます。外部キー1は実行されたように見えましたが、他の問題を本当に助けませんでした。 – Ivan

+1

@Ivan - 問題が見つかりました。WHERE句が間違っていました。また、 'TABLE_TYPE'でフィルタリングする必要があります。アップデートを確認し、問題がまだ残っている場合はお知らせください。 – Tommy

+1

AzureのSQL Server上で魅力的に動作しました! – dorsz

-1

また、C#でデータベースを削除し、ExecuteNonQueryで新しいデータベースを作成することもできます。

queryString = "DROP DATABASE TestDB2"; 

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

ここで、接続はAzure SQLデータベースのマスターデータベースへの接続です。受け入れ答えは、Azureの上で私のために動作しませんでしたので、ジャストが答えに追加する

queryString = "CREATE DATABASE TestDB2 (EDITION = 'standard')"; 
+0

どうすればAzureはC#から新しいデータベースを作成できますか? – Ivan

29

:データベースを作成する代わりに

、。 以下のスクリプトを使用して、すべてのテーブルを削除し、基本的にアジールデータベースをリセットします。 まず、すべての制約を削除してから、すべてのテーブルを削除します。

@SkorunkaFrantišekがコメントしたように、このスクリプトでは、デフォルトの[dbo]スキーマを使用することを前提としています。あなたは自分のスキーマ名で置き換えることができますが。私はそれが私のリポジトリの1つに保存されていたよう

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

は、悲しいことに、私はもうこのコードのソースを見つけることができません。 私はそれが誰かを助けることを願っています。

+0

ありがとう、それはまさに私が探していたものでした。 SSMSを使用してAzureサーバーに接続し、ターゲットデータベースに対して新しいクエリを実行し、上記のビンゴを実行して、新しいSQLデータベースを作成します。 –

+1

デフォルトの "dbo"スキーマを使用しない場合、上記は機能しません。 –

+0

@SkorunkaFrantišek良い点、私は私の答えにメモを追加します。 – Gizmo3399

3

私はAzureのSQL Serverの(すなわちに接続するI通常

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

それほど単純ではありません。

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

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

ASPNETコアMVC(MVC6)のため

+0

私はこれがAzure SQLではうまくいかないと思っています。私はAzure PortalでDBを作り直さなければなりませんでした。 –

+0

これはAzureのSQL Serverで動作します。それは私が使うものです。 – iberodev

+0

奇妙なことに、数分前に試しました。 MSSMSのDBを削除してから、移行を実行してユーザーに「cat'nアクセス提供データベース」エラーなどを表示しようとしました。 –

0

AzureのSQLは基本的にSQLサーバーです。これも有効です。 MS SQL Server Management Studioを使用することができますhttps://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

管理者アカウントを使用してデータベースを開き、ドロップテーブルのSQLコマンドを実行するか、GUIの右クリックメニューを使用して、ローカルデータベース。

同様のことは、Visual Studio SQL Serverオブジェクトエクスプローラで行うことができます。ルート "Add SQL server"を右クリックしてください。

0

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

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 
関連する問題