我正在編寫一個安裝腳本,用於安裝所有表,存儲過程,視圖,全文索引,用戶等。SQL完全空數據庫
如果用戶具有所有正確的權限並且腳本從頭到尾都運行,則一切正常。但是,如果腳本在中途死亡,那麼它不能再運行。
爲了實現這個目標,我希望基本上將數據庫返回到「全新」狀態,它沒有任何內容。
我意識到如何刪除每個表/ sp/view ..在他們自己,但我正在尋找一種更一般的方式來重置數據庫。
我還需要能夠刪除全文目錄和用戶。
感謝您的任何幫助。
運行SQL Server 2005
我正在編寫一個安裝腳本,用於安裝所有表,存儲過程,視圖,全文索引,用戶等。SQL完全空數據庫
如果用戶具有所有正確的權限並且腳本從頭到尾都運行,則一切正常。但是,如果腳本在中途死亡,那麼它不能再運行。
爲了實現這個目標,我希望基本上將數據庫返回到「全新」狀態,它沒有任何內容。
我意識到如何刪除每個表/ sp/view ..在他們自己,但我正在尋找一種更一般的方式來重置數據庫。
我還需要能夠刪除全文目錄和用戶。
感謝您的任何幫助。
運行SQL Server 2005
聽起來像是Drop Database工作:
-- SQL Server Syntax
DROP DATABASE [ IF EXISTS ] { database_name | database_snapshot_name } [ ,...n ] [;]
可以運行在一個事務中的整個腳本,然後調用回滾,如果它失敗了呢?
CREATE TABLE可以像INSERT/UPDATE一樣輕鬆地回滾。
全新包含什麼?如果您有權執行此操作,請刪除數據庫並重新創建它。
您可以在一個事務中運行整個腳本,因此您可以在任何時候回滾它。
第二個選項 - 安裝前始終創建備份。如果失敗,請從備份恢復數據庫
我不確定這是否是您要查找的內容,但是對於每個對象,您可以在創建它之前測試它是否存在。然後,如果腳本在中間失敗,則可以再次運行該腳本。
IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(@Object) AND type = (@Type))
...
如果您在腳本編寫過程的每個對象自動的,你應該能夠包住整個過程在一個事務中,並提供錯誤處理的每一個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
紅G吃的SQL比較會爲你做,它是一個偉大的工具。
刪除並重新DB:
use master
IF EXISTS(select * from sys.databases where name='YourDBName')
DROP DATABASE YourDBName
CREATE database YourDBName
那是當然的路要走,請不要介意我的答覆=) – 2009-07-09 16:48:08
@d。我不確定爲什麼它是惡意的。這是爲了用戶權限還是有其他原因? – Jonathan 2009-07-09 16:53:09