it-swarm.com.ru

Как удалить все таблицы и сбросить базу данных SQL Azure

У меня есть проект ASP.NET MVC 5, который работает локально, и всякий раз, когда мне нужно выбросить базу данных, я просто открываю новый запрос, меняю доступный выпадающий список базы данных на master, затем закрываю соединение на моей локальной базе данных и запускаю запрос "удалить базу данных [имя]". Затем я строю проект, захожу в консоль диспетчера пакетов и запускаю «Update-Database». Кажется, это перестраивает свежую локальную базу данных и запускает метод seed в моем файле configuration.cs.

Проблема заключается в том, что когда мне нужно протестировать что-либо в реальной среде, чтобы я мог протестировать API и так далее, я выполню развертывание на веб-сайте Azure и в сопутствующей базе данных Azure, что приятно и легко. Я отмечаю «Выполнить код первой миграции» в мастере публикации, и большую часть времени он работает, и я могу запустить и отладить свою живую версию. Иногда мне нужно сдуть эту базу данных и начать все заново, но единственный способ, который я нашел, - это зайти на портал Azure, удалить базу данных, а затем заново создать ее с тем же именем. Для обработки Azure требуется некоторое время, поэтому это медленный цикл тестирования.

Есть ли быстрый способ просто сбросить/сбросить базу данных SQL Azure в ее свежее, пустое, девственное состояние, а затем повторно опубликовать с помощью «выполнить код для первой миграции», чтобы он заново создал таблицы и заново заполнил данные ?

Я видел некоторые разговоры о создании начальной миграции после того, как я создал базу данных, а затем пытался использовать Powershell, чтобы сделать некоторый откат к этому начальному состоянию, но мне не повезло заставить его работать, и Я хочу удалить все данные одновременно. Возможно, я только что получил неправильный синтаксис или не нашел достаточно хорошего учебника. Хотя я могу выполнить запрос к базе данных Azure «отбросить базу данных [x]», он буквально убивает экземпляр базы данных SQL Azure, как и следовало ожидать, и вам нужно вернуться на портал, чтобы воссоздать его. Иногда это начальное состояние не годится, так как модель была обновлена, так что в любом случае это может быть бесполезно.

Я чувствую, что должен быть какой-то более простой и быстрый способ протестировать изменения в реальной среде, так как все эти замечательные инструменты и ярлыки предоставлены MS, но они просто отбросили мяч на этом этапе разработки или я что-то упустил?

38
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

В моем тестировании это работало без проблем (за исключением того, что у меня не было предложения where в DROP TABLE во время запроса, поскольку я не использую миграцию Code First или EF).

41
Tommy

Просто чтобы добавить ответы, так как принятый ответ не работал для меня в Azure . Используйте приведенный ниже сценарий, чтобы удалить все таблицы и в основном сбросить базу данных Azure . Сначала он удаляет все ограничения, а затем удаляет все столы.

Как прокомментировал @Skorunka Františ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

К сожалению, я больше не могу найти источник этого кода, так как он был сохранен в одном из моих репозиториев .... Надеюсь, он кому-нибудь поможет.

38
Gizmo3399

Я обычно 

  1. откройте SQL Server Management Studio или из Visual Studio откройте проводник объектов SQL Server
  2. Я подключаюсь к Azure SQL Server (то есть: yourserver.database.windows.net с выбранными вами именем пользователя и паролем для аутентификации SQL Server) (также помните, что вам потребуется добавить исключение брандмауэра на портале Azure для подключения вашего компьютера к базе данных таким образом)
  3. Щелкните правой кнопкой мыши на базе данных и удалите. 

Так просто.

Затем, так как вы упомянули, что у вас есть подход, основанный на миграции кода, просто запустите миграцию снова на Azure SQL Server (например, при публикации убедитесь, что вы отметили опцию применения миграций для данной строки подключения к серверу SQL).

Обычно я удаляю удаленную базу данных, а затем повторно внедряю приложение с помощью команды для повторного запуска миграций. Это создаст снова базу данных с новыми таблицами. Код для заполнения базы данных находится в моем коде запуска, поэтому он появляется каждый раз, когда приложение инициализируется, если в БД нет значений.

Это также верно для AspNet Core Mvc (MVC6)

5
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
2
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».

0
Serena Yu