SQL完全空数据库

时间:2009-07-09 16:39:22

标签: sql sql-server sql-server-2005

我正在编写一个安装脚本,用于安装所有表,存储过程,视图,全文索引,用户等。

如果用户具有所有正确的权限并且脚本从头到尾运行,则一切正常。但是,如果脚本在某个中途死亡,那么它就不能再次运行了。

为了实现这一目标,我希望基本上将数据库返回到“全新”状态,在该状态下它没有任何内容。

我意识到如何自己删除每个表/ sp / view ..但我正在寻找一种更通用的方法来重置数据库。

我还需要能够删除全文目录和用户。

感谢您的帮助。

运行SQL Server 2005

8 个答案:

答案 0 :(得分:7)

您是否可以在事务中运行整个脚本,然后在失败时调用回滚?

可以像INSERT / UPDATE一样轻松地回滚CREATE TABLE。

答案 1 :(得分:5)

听起来像是Drop Database的工作:

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

答案 2 :(得分:2)

全新的什么都没有?如果您有权执行此操作,请删除数据库并重新创建它。

答案 3 :(得分:0)

我不确定这是否是您正在寻找的,但对于每个对象,您可以在创建之前测试是否存在。然后,如果脚本在中间失败,您可以再次运行脚本。

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

...

答案 4 :(得分:0)

如果每个对象都自动执行脚本编写过程,则应该能够将整个过程包装在事务中,并为每个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

<强>页脚:

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

Wrapper(对于每个数据库对象):

/* 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

答案 5 :(得分:0)

Red Gate的SQL Compare将为您完成,它是一个很棒的工具。

答案 6 :(得分:0)

删除并重新创建数据库:

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

答案 7 :(得分:-1)

您可以在一个事务中运行整个脚本,这样您就可以随时回滚它。

第二个选项 - 安装前始终创建备份。如果失败,请从备份还原数据库