Подтвердить что ты не робот

Как удалить все таблицы и 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, но они просто бросают мяч здесь для этой фазы разработки или я что-то упускаю

4b9b3361

Ответ 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' )";