SQL полностью пустая база данных - PullRequest
8 голосов
/ 09 июля 2009

Я пишу скрипт установки, который устанавливает все таблицы, хранимые процедуры, представления, полнотекстовые индексы, пользователей и т. Д.

Все работает нормально, если у пользователя есть все необходимые разрешения и скрипт запускается от начала до конца. Однако, если сценарий умирает где-то на полпути, его нельзя просто запустить снова.

Для этого я хочу вернуть базу данных в «совершенно новое» состояние, в котором она не имеет ничего.

Я понимаю, как удалить каждую таблицу / sp / view .. самостоятельно, но я ищу более общий способ сброса базы данных.

Мне также нужно иметь возможность удалять полнотекстовые каталоги и пользователей.

Спасибо за любую помощь.

Запуск SQL Server 2005

Ответы [ 8 ]

7 голосов
/ 09 июля 2009

Можете ли вы запустить весь скрипт внутри транзакции, а затем вызвать откат в случае сбоя?

CREATE TABLE можно откатить так же легко, как INSERT / UPDATE.

5 голосов
/ 09 июля 2009

Звучит как работа для Удалить базу данных :

-- SQL Server Syntax  
DROP DATABASE [ IF EXISTS ] { database_name | database_snapshot_name } [ ,...n ] [;]
2 голосов
/ 09 июля 2009

Совершенно новый, не содержащий ничего? Удалите базу данных и создайте ее заново, если у вас есть для этого разрешения.

0 голосов
/ 04 декабря 2014

Удаление и воссоздание БД:

use master
IF EXISTS(select * from sys.databases where name='YourDBName')
DROP DATABASE YourDBName
CREATE database YourDBName
0 голосов
/ 09 июля 2009

Red Gate SQL Compare сделает это за вас, это отличный инструмент.

0 голосов
/ 09 июля 2009

Если у вас есть автоматизированный процесс создания сценариев для каждого объекта, вы должны иметь возможность обернуть весь процесс в транзакцию и обеспечить обработку ошибок для каждой статистики DDL. Это также хорошо работает при применении обновлений схемы. Обратите внимание, что это основано на сценариях обновления, которые генерирует Red-Gate SQL Compare.

Заголовок:

SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#tmpErrors')) DROP TABLE #tmpErrors
GO
CREATE TABLE #tmpErrors (Error int)
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
GO

Footer:

IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT>0 BEGIN
    PRINT 'Script succeeded'
    COMMIT TRANSACTION
END
ELSE BEGIN 
    PRINT 'Script failed'
END
GO
DROP TABLE #tmpErrors

Оболочка (для каждого объекта базы данных):

/* Insert Data Definition here then append with...*/
GO
IF @@ERROR<>0 AND @@TRANCOUNT>0 ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END
GO
0 голосов
/ 09 июля 2009

Я не уверен, что это то, что вы ищете, но для каждого объекта вы можете проверить, существует ли, прежде чем создавать его. Затем вы можете снова запустить скрипт, если он не получится в середине.

IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(@Object) AND type = (@Type))

...

0 голосов
/ 09 июля 2009

Вы можете запустить весь скрипт за одну транзакцию, поэтому вы сможете откатить его в любой момент.

Второй вариант - перед установкой всегда создавайте резервную копию. Если это не удалось, восстановите базу данных из резервной копии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...