3

我的查詢是關於使用非硬編碼的文件位置來初始化變量DefaultDataPath和DefaultLogPath。在採用數據庫項目作爲我們的標準部署和數據庫管理工具並將我們現有的腳本遷移到數據庫項目之前,我們一直在使用SET CREATE和INITIALIZE腳本來設置數據庫。我們有下面的SQL查詢與文件位置來創建數據庫:以編程方式設置DefaultDataPath和DefaultLogPath(使用SQL語句初始化路徑)

SET @data_path = (SELECT SUBSTRING(filename, 1, CHARINDEX(N'master.mdf', LOWER(filename)) - 1) 

      FROM sys.sysaltfiles WHERE dbid = 1 AND fileid = 1); 

set @[email protected]_path + 'CF_DB.mdf' 
set @cfdata='CF_DB_Data' 
set @cflog='CF_DB_Log' 
set @[email protected]_path + 'CF_DB_log.ldf' 
declare @sql nvarchar(500) 
set @sql = 'CREATE DATABASE [CF_DB] ON (NAME = ' + quotename(@cfdata) + ',FILENAME =' + quotename(@mdb_file) + ',SIZE = 53, FILEGROWTH = 10%) LOG ON (NAME =' + quotename(@cflog) + ',FILENAME = ' + quotename(@ldf_file) + ', SIZE = 31, FILEGROWTH = 10%)COLLATE SQL_Latin1_General_CP1_CI_AS' 
exec(@sql) 

在這裏,我們試圖找出對主數據庫的MDF文件的位置,並使用同一位置CREATE DATABASE。

問題:使用生成的腳本(部署操作之後),有一個自動生成的SQLCMD變量,用一些默認路徑(硬編碼的一個)或空字符串進行初始化(它們使用SQL Server 2008或2005使用的默認數據文件路徑)。

:setvar DatabaseName "CF" 
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2008\MSSQL\DATA\" 
:setvar DefaultLogPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2008\MSSQL\DATA\" 

我們需要使它像現有的系統一樣工作。我們需要知道MASTER DB數據和日誌文件的路徑,並使用相同的路徑來初始化DefaultDataPath和DefaultLogPath。我們無法使用PreDeployment腳本,因爲在將PreDeploymentScript嵌入最終Deploy Scripts之前,數據庫設置是通過Database Project生成的腳本完成的。

下一件大事:開發人員需要在SQL Server Management Studio中切換到SQLCMD模式以運行由DB Project生成的腳本。這是我們的實施團隊的要求,不要使用SQLCMD模式來設置DATBASE。爲了克服這些步驟,我需要修改生成的SQL文件,並使用SQL變量而不是SQLCMD變量。我們可以生成乾淨的SQL語句並保持自動化腳本生成嗎?我知道這兩個問題都是相互關聯的,因此一個解決方案將解決另一個問題。

感謝您對上述討論提出的任何良好建議或幫助。

問候

Sumeet

回答

0

不知道如何最好地處理你的文件的路徑,但我懷疑你會想不使用默認文件路徑的設置,並改用您可以通過控制一個新的文件路徑一個變量。

這聽起來像你想讓開發人員輕鬆更新本地機器。我的建議是打造出來的那些下面的一些批處理文件:

  • 將路徑設置爲包括位置MSBuild.exe
  • 獲取位置主數據庫
  • 通在該位置一個變量
  • 運行MSBuild命令將路徑變量設置爲本地主路徑 併發布數據庫/更改。

總的來說,這聽起來像比它真正的價值更麻煩。我建議你發送一個SQL腳本給所有的開發人員,讓他們正確設置他們的默認數據/日誌路徑,並使用默認值。

我建議你看看設置一些批處理文件來運行MSBuild命令。如果沒有它們生成腳本並在本地運行它們,您將可以更輕鬆地將數據庫構建到開發人員手中。或者,您可以讓他們更改他們的SSMS默認值,以便爲其連接設置SQLCMD模式。 SSDT使得這一點更好一些,因爲在沒有打開SQLCMD模式的情況下它不會運行 - 消除了VS2008/VS2010 DBProjects中的大量混亂。

我使用類似於下面的東西來構建和部署時,我們是在DB項目:

msbuild /m .\MyDB\MyDB.dbproj /t:build 
msbuild /m .\MyDB\MyDB.dbproj /t:deploy /p:TargetConnectionString="Data Source=localhost;Integrated Security=True;Pooling=False;" /p:TargetDatabase="MyDB" 
0

當SSDT/VS生成SQL文件,它實際上有違你告訴它的服務器一些查詢連接到。您在此獲得的設置例如...

:setvar DatabaseName "CF" 
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2008\MSSQL\DATA\" 
:setvar DefaultLogPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2008\MSSQL\DATA\" 

從您在發佈文件/配置文件中指定的目標數據庫連接的服務器設置獲取。

在您使用生成腳本,打開REGEDIT.EXE下HKEY_LOCAL_MACHINE \ SOFTWARE搜索鍵「DefaultLog」和「DefaultData」 \微軟服務器 - 他們應該是在同一地點。看看它們是否與您的腳本生成的設置相匹配。

您可以在服務器/您的PC上更改它們(您指向的任何位置),它會生成您在生成的SQL腳本中輸入的位置。在你不擁有的或服務於生產的服務器周圍自然謹慎,因爲這會改變服務器上的一個設置,它指向SQL Server放置新數據庫的位置。這是一個與您在SQL Server屬性 - >數據庫設置中輸入的設置不同的設置。

希望有幫助!

+0

要解決SQLCMD問題,您可以使用DACPAC部署嗎? – LeedsDBA 2015-09-20 13:38:12

相關問題