Как удалить все таблицы и reset базу данных Azure SQL
У меня есть проект ASP.NET MVC 5, который работает локально, и всякий раз, когда мне нужно сдуть БД, я просто открываю на нем новый запрос, изменяю раскрывающееся меню доступной базы данных, чтобы завершить работу, а затем закрою соединение на моем локальном db и запустите запрос "drop database [name]". Затем я создаю проект, перехожу в консоль менеджера пакетов и запускаю "Update-Database". Это, похоже, перестроит новую локальную базу данных и запускает метод seed в моем файле configuration.cs.
Проблема в том, когда мне нужно протестировать вещи в живой среде, чтобы я мог тестировать API и, что лучше, я буду развертывать сайт Azure и прилагаемую Azure DB, что приятно и легко сделать. Я проверяю "Выполнять первые шаги миграции кода" в мастере публикации и большую часть времени, когда он работает, и я могу запускать и отлаживать мою живую версию. Иногда мне нужно сдуть этот db и начать с нуля, но единственный способ, который я действительно нашел, - это войти в портал Azure, удалить базу данных и затем повторно создать его с тем же именем. Для обработки Azure требуется некоторое время, поэтому это медленный цикл тестирования.
Есть ли быстрый способ просто сбросить / reset базу данных Azure SQL в новое, пустое, девственное состояние, а затем повторно опубликовать с помощью "выполнить первые миграции миграции кода", чтобы он заново создавал таблицы и повторно засеять данные?
Я видел некоторые разговоры о создании начальной миграции после создания db, а затем, пытаясь использовать Powershell, сделать какой-то откат к этому начальному состоянию, но мне не повезло получить его работа, и я хочу удалить все данные одновременно. Возможно, я только что получил неправильный синтаксис или не нашел достаточно хорошего учебника. Хотя я могу запустить запрос в Azure DB для "drop database [x]", он буквально убивает экземпляр SQL Azure DB, как вы ожидали, и вам нужно вернуться в портал, чтобы воссоздать его. Иногда это начальное состояние не подходит, поскольку модель с тех пор была обновлена, поэтому это может быть бесполезно.
Я чувствую, что должен быть более простой способ быстрее протестировать изменения в живой среде, так как там есть все эти прекрасные инструменты и ярлыки, предоставленные MS, но они просто бросают мяч здесь для этой фазы разработки или я что-то упускаю
Ответы
Ответ 1
Поскольку API-интерфейс не существует, о котором я знаю, мы использовали этот script, чтобы использовать запрос 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
В моем тестировании это работало без проблем (кроме того, что у меня не было предложения where в DROP TABLE во время запроса, так как я не использую миграции First Code или EF).
Ответ 2
Просто добавьте ответы, так как принятый ответ не работал у меня на Azure.
Используйте ниже script, чтобы удалить все таблицы и в основном reset базу данных azure.
Сначала он удаляет все ограничения и затем удаляет все таблицы.
Как заметил @Skorunka František, этот script предполагает использование схемы по умолчанию [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
К сожалению, я больше не могу найти источник этого кода, поскольку он был сохранен в одном из моих репозиториев.
Надеюсь, это поможет кому-то.
Ответ 3
Я обычно
- откройте SQL Server Management Studio или Visual Studio, открыв обозреватель объектов SQL Server
- Я подключаюсь к Azure SQL Server (т.е.
yourserver.database.windows.net
с выбранным вами именем пользователя и паролем для проверки подлинности SQL Server) (также помните, что вам нужно будет добавить исключение брандмауэра в портал Azure для подключения с вашего ПК к базы данных таким образом).
- Щелкните правой кнопкой мыши по базе данных и удалите ее.
Проще всего.
Затем, поскольку вы упомянули, что у вас есть подход к первой миграции кода, просто запустите миграцию снова на Azure SQL Server (например, при публикации убедитесь, что вы проверяете возможность применения миграции для данной строки подключения сервера sql)
Обычно я удаляю удаленную базу данных, а затем повторно развертываю приложение с помощью команды для повторного запуска миграции. Это снова создаст базу данных с новыми таблицами. Код для загрузки базы данных находится в моем стартап-коде, поэтому он засевается в любое время, когда приложение инициализируется, если в DB нет значений.
Это также справедливо для AspNet Core Mvc (MVC6)
Ответ 4
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 из выпадающей таблицы или используйте меню правой кнопки мыши графического интерфейса, чтобы делать все, что хотите, так же, как с помощью локальной базы данных.
Аналогичную вещь можно сделать в обозревателе объектов SQL Server Visual Studio. Просто щелкните правой кнопкой мыши корень "Добавить SQL-сервер".
Ответ 5
Просто добавьте свой вариант в микс... Это также учитывает Views и внешние таблицы. Он не будет закрывать внешние таблицы, которые необходимо удалить отдельно с помощью 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
Ответ 6
Кроме того, вы можете удалить базу данных на С# и создать новую базу данных с ExecuteNonQuery.
queryString = "DROP DATABASE TestDB2";
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
Если соединение представляет собой соединение с базой данных базы данных Azure SQL Database.
Кроме того, для создания базы данных:
queryString = "CREATE DATABASE TestDB2 ( EDITION = 'standard' )";