ローカルで動作する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が提供するこれらの優れたツールとショートカットはすべて存在するため、ライブ環境で変更をテストするより簡単な方法があるはずですが、開発のこの段階でボールをドロップしただけですか、何か不足していますか?
私が知っているこれを行う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句がなかったことを除く)。
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つに保存していたため、このコードのソースはもう見つかりません。私はそれが誰かを助けることを願っています。
私は通常
yourserver.database.windows.net
選択したSQL Server認証オプションのユーザー名とパスワード)(また、この方法でPCからデータベースに接続するには、Azureポータルにファイアウォール例外を追加する必要があることに注意してください)それと同じくらい簡単です。
次に、コードファーストの移行アプローチがあると述べたので、Azure SQL Serverで移行を再度実行するだけです(たとえば、公開時に、指定されたSQLサーバー接続文字列に移行を適用するオプションを確認してください)
通常、リモートデータベースを削除してから、移行を再実行するコマンドを使用してアプリケーションを再デプロイします。これにより、新しいテーブルを使用してデータベースが再度作成されます。データベースをシードするコードは、スタートアップコードに含まれているため、DBに値がない場合にアプリが初期化されるたびにシードされます。
これは、AspNet Core Mvc(MVC6)にも有効です。
バリアントをミックスに追加するだけです...これは、ビューと外部テーブルも考慮に入れます。 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
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サーバーの追加」を右クリックします。