2011-04-11 32 views
5

我有一個使用Wix創建的安裝程序。我希望能夠指定安裝sql server的位置。我能想到的一個解決方案是在CreateDatabase腳本中放置一個佔位符,並且在運行時只需將佔位符替換爲用戶指定的實際路徑。Wix:在指定位置創建一個sql server數據庫

我想知道是否有更好的方法來做到這一點?威克斯是否提供我可以使用的任何東西?

感謝,

+1

我最終通過使用動態SQL解決了這個問題。對於任何正在尋找解決方案的人,請檢查以下問題的接受答案: http://stackoverflow.com/questions/5626850/sql-server-use-parameter-in-create-database – sean717 2011-04-13 17:23:46

回答

5

您可以利用標準WiX SQL extension。例如,SqlString元素提供了一個選項來指定在安裝時執行的SQL查詢。 SqlDatabase元素提供了創建SQL數據庫的開箱即用選項。兩者分別接受@SQL和@Server屬性的Windows Installer屬性。這意味着你可以獲得用戶輸入,將其保存到屬性中並在Sql元素中使用該屬性。

0

你不能從維克斯得到這個免費的。

使用SqlString,一些參數和你所注意到的直接使用CREATE DATABASE一樣。你需要:

  • DB_SERVER
  • DB_INSTANCE
  • DB_PORT
  • DB_DATA_FOLDER
  • DB_LOG_FOLDER

如果你期望使用SQL權威性你會當然也需要通過DB_USER/DB_PASS

我會強烈推薦使用uggest編寫自己的自定義操作來驗證參數。

  • 服務器/實例是否存在於本地機器上?儘管您可以始終遠程連接到SQL服務器,並告訴它在給定驅動器上安裝文件,但它使得事先驗證有關這些驅動器的任何事情變得更加困難。
  • 使用給定的服務器/實例/端口和憑證可以連接到sql服務器主數據庫,您甚至可以檢查提前創建數據庫的權限。你可以逃避不使用端口,但一些DBA仍然通過默默無聞的方式去安全。
  • 您是否提供了有效的數據/日誌文件夾。根植於實際存在的驅動器的路徑。
  • 驗證Data/Log文件夾驅動器上的足夠空間也是一個好主意。我遇到了很多客戶,他們不檢查數據文件,並在空的巨大D:數據驅動器上使用C:驅動器。我通常做一個組合,最小的自由空間,以及最小可用百分比(在磁盤上,例如至少25%的可用空間)
0

擴大嚴的回答,還有,如果你使用SQL擴展語法非常簡單 - 你需要MDF和LDF(數據+日誌文件)都包含在您的SQL數據庫中,但通過引用相同的文件名附加它們。

以下假定SQL Express服務器將在本地的本地主機\ SQLEXPRESS實例

<Property Id="SQLINSTANCE" Value="SQLEXPRESS" /> 
<Property Id="SQLSERVER" Value="LOCALHOST" />  
<Property Id="DATA_FOLDER" Value="C:\Program Files\Microsoft SQL Server\MSSQL11.SQLExpress\MSSQL\DATA\" /> 

<Component Id="Sql_Database_Deploy" NeverOverwrite="yes" Directory="[DATA_FOLDER]"> 
    <File Source="Northwind.mdf"></File> 
    <File Source="Northwind)log.ldf"></File> 
    <sql:SqlDatabase Id="SqlDatabase" Database="Northwind" Server="[SQLSERVER]" Instance="[SQLINSTANCE]" CreateOnInstall="yes" DropOnUninstall="yes"> 
     <sql:SqlFileSpec Filename="[DATA_FOLDER]Northwind.mdf" Id="Northwind_SqlFileSpec"/> 
     <sql:SqlLogFileSpec Filename="[DATA_FOLDER]Northwind_log.ldf" Id="Northwind_SqlLogFileSpec"/> 
    </sql:SqlDatabase> 
    </Component> 

我已經從這個例子中爲簡潔起見省略認證下安裝,但你也可以指定SQL用戶用於使用User元素的命令,並在SqlDatabase屬性中引用用戶元素的Id。

相關問題