2012-11-02 83 views
0

我有,我想腳本中使用下面的恢復ELMAH數據庫:如何阻止SQL Server從覆蓋數據庫恢復?

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

您需要(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 
+0

Marc_S,謝謝你的信息。我試圖完成的不是以不同的名稱恢復備份,我想要的是備份過程失敗而不是自動覆蓋數據庫。基本上我想要if存在然後失敗的語義,但我希望恢復作業本身失敗,沒有我檢查數據庫是否存在。有沒有覆蓋選項? –

+0

@ObligatoryMoniker:我在回答中顯示的T-SQL'RESTORE'語句將不會覆蓋現有的數據庫。爲此,您需要添加一個'REPLACE'子句(例如在'NOUNLOAD'之後) –

相關問題