2009-07-09 110 views
8

我正在編寫一個安裝腳本,用於安裝所有表,存儲過程,視圖,全文索引,用戶等。SQL完全空數據庫

如果用戶具有所有正確的權限並且腳本從頭到尾都運行,則一切正常。但是,如果腳本在中途死亡,那麼它不能再運行。

爲了實現這個目標,我希望基本上將數據庫返回到「全新」狀態,它沒有任何內容。

我意識到如何刪除每個表/ sp/view ..在他們自己,但我正在尋找一種更一般的方式來重置數據庫。

我還需要能夠刪除全文目錄和用戶。

感謝您的任何幫助。

運行SQL Server 2005

回答

6

聽起來像是Drop Database工作:

-- SQL Server Syntax 
DROP DATABASE [ IF EXISTS ] { database_name | database_snapshot_name } [ ,...n ] [;] 
7

可以運行在一個事務中的整個腳本,然後調用回滾,如果它失敗了呢?

CREATE TABLE可以像INSERT/UPDATE一樣輕鬆地回滾。

+0

那是當然的路要走,請不要介意我的答覆=) – 2009-07-09 16:48:08

+0

@d。我不確定爲什麼它是惡意的。這是爲了用戶權限還是有其他原因? – Jonathan 2009-07-09 16:53:09

2

全新包含什麼?如果您有權執行此操作,請刪除數據庫並重新創建它。

-1

您可以在一個事務中運行整個腳本,因此您可以在任何時候回滾它。

第二個選項 - 安裝前始終創建備份。如果失敗,請從備份恢復數據庫

0

我不確定這是否是您要查找的內容,但是對於每個對象,您可以在創建它之前測試它是否存在。然後,如果腳本在中間失敗,則可以再次運行該腳本。

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

...

0

如果您在腳本編寫過程的每個對象自動的,你應該能夠包住整個過程在一個事務中,並提供錯誤處理的每一個DDL statment。這在應用模式更新時也很有效。請注意,這是基於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 

頁腳:

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

紅G吃的SQL比較會爲你做,它是一個偉大的工具。

-1

刪除並重新DB:

use master 
IF EXISTS(select * from sys.databases where name='YourDBName') 
DROP DATABASE YourDBName 
CREATE database YourDBName