2009-07-09 67 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