如何从覆盖数据库中停止SQL Server还原?

时间:2012-11-02 17:43:08

标签: sql-server backup restore

我有一个ELMAH数据库,我想使用以下内容编写恢复脚本:

RESTORE DATABASE [Elmah] 
FROM DISK = N'E:\Elmah_backup_2012_11_02_030003_1700702.bak' 
WITH FILE = 1,  
MOVE N'Elmah' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\Elmah.mdf',  
MOVE N'Elmah_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\Elmah.ldf',  
NOUNLOAD, STATS = 10
GO

尽管每次执行此语句时我都不包括WITH REPLACE,但它会恢复现有数据库。

在此操作之前,我将始终删除所有数据库,并且我从不希望此代码意外地将数据库恢复为生产中的数据库。

如何更改此代码以使其永远不会覆盖现有数据库?

我实际上是通过SMO对象做到这一点,但原理和结果是一样的,所以我希望将这简化为只需要的TSQL,希望我能将这些信息推广到需要设置的东西上。 SMO.Restore对象。

1 个答案:

答案 0 :(得分:1)

您需要(a)为恢复的数据库提供新的逻辑名称,并且(b)您需要定义新的物理文件名,因此不会覆盖现有的文件名。尝试这样的事情:

RESTORE DATABASE [Elmah_Restored]       <== new (and unique) logical database name
FROM DISK = N'E:\Elmah_backup_2012_11_02_030003_1700702.bak' 
WITH FILE = 1,  
MOVE N'Elmah' TO 
     N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\Elmah_restored.mdf',   <== new (and unique) physical file name
MOVE N'Elmah_log' TO 
     N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\Elmah_restored_log.ldf',   <== new (and unique) physical file name
NOUNLOAD, STATS = 10
GO