2015-08-19 48 views
3

通過在VS 2015數據庫項目的上下文菜單中選擇「發佈」,我可以創建一個腳本,其中包含將數據庫部署到SQL Server的所有必要命令(「xyz.publish.sql」)。如何命名數據庫的文件名並在Visual Studio 2015數據庫項目中設置其位置?

數據庫名稱和它在這個腳本路徑被聲明爲變量:

:setvar DatabaseName "myDatabase" 
:setvar DefaultFilePrefix "myDatabase" 
:setvar DefaultDataPath "D:\Databases\" 
:setvar DefaultLogPath "D:\Databases\" 

也文件名似乎是自動生成:

PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf') 
LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf')... 

我在哪裏可以設置的路徑和文件名?我不想在文件名中附加「_Primary」,路徑需要額外的子文件夾。

如果我在發佈腳本中進行了更改,下次當Visual Studio生成此腳本時,我的更改可能會被覆蓋。

回答

1

您可以將預部署腳本添加到分離數據庫,移動/重命名文件,然後使用新文件重新掛接數據庫的項目。

-- detach db before moving physical files 
USE [master] 
GO 
exec sp_detach_db @dbname = N'$(DatabaseName)' 
GO 

-- enable xp_cmdshell 
exec sp_configure 'show advanced options', 1 
GO 
RECONFIGURE 
GO 
exec sp_configure 'xp_cmdshell', 1 -- 0 = Disable , 1 = Enable 
GO 
RECONFIGURE 
GO 

-- move physical files 
EXEC xp_cmdshell 'MOVE "$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf", "C:\$(DatabaseName)\$(DatabaseName).mdf"' 
EXEC xp_cmdshell 'MOVE "$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf", "C:\$(DatabaseName)\$(DatabaseName)_log.ldf"' 
GO 

-- reattach db with new filepath 
CREATE DATABASE [$(DatabaseName)] ON 
(NAME = [$(DatabaseName)], FILENAME = 'C:\$(DatabaseName)\$(DatabaseName).mdf'), 
(NAME = [$(DatabaseName)_log], FILENAME = 'C:\$(DatabaseName)\$(DatabaseName)_log.ldf') 
FOR ATTACH 
GO 

-- disable xp_cmdshell 
exec sp_configure 'show advanced options', 1 
GO 
RECONFIGURE 
GO 
exec sp_configure 'xp_cmdshell', 0 -- 0 = Disable , 1 = Enable 
GO 
RECONFIGURE 
GO 

USE [$(DatabaseName)]; 
GO 

在此的一些注意事項:

  • 我硬編碼C:\作爲爲了簡化文件的新位置。您最好創建一個SQLCMD變量來存儲此路徑。
  • 如果xp_cmdshell 'MOVE ...失敗,它會默默地這樣做。爲了保持我的答案簡單,我沒有包含任何錯誤檢查,但您可以通過將xp_cmdshell的結果插入臨時表中來實現自己的檢查。請參閱How to capture the error output from xp_cmdshell in SQL Server
  • 您可能會遇到xp_cmdshell 'MOVE ...命令的權限問題。在這種情況下,您可能需要調整MOVE語句中源路徑和目標路徑的權限。您可能還需要以其他用戶身份運行該命令 - 請參閱here (Permissions section)here以瞭解初學者。
+0

謝謝。我幾分鐘前用你的方式解決了它,但是添加了一個部署後腳本並使用「ALTER Database ... FILENAME = ...」。 –

0

是的,他們會改變,但這是它的工作方式。你必須改變腳本。你可以做的另一件事是不指定SQL Server將使用默認實例的位置 - 但也包括更改腳本。

相關問題