我正在编写一个安装脚本,用于安装所有表,存储过程,视图,全文索引,用户等。
如果用户具有所有正确的权限并且脚本从头到尾运行,则一切正常。但是,如果脚本在某个中途死亡,那么它就不能再次运行了。
为了实现这一目标,我希望基本上将数据库返回到“全新”状态,在该状态下它没有任何内容。
我意识到如何自己删除每个表/ sp / view ..但我正在寻找一种更通用的方法来重置数据库。
我还需要能够删除全文目录和用户。
感谢您的帮助。
运行SQL Server 2005
答案 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)
您可以在一个事务中运行整个脚本,这样您就可以随时回滚它。
第二个选项 - 安装前始终创建备份。如果失败,请从备份还原数据库