2013-10-02 45 views
1

我有一個安裝程序來安裝數據庫。數據庫與一些登錄一起創建。要創建登錄,我在SqlString元素中使用master數據庫。只有在SQL服務器上擁有非常高權限的用戶才能訪問主數據庫。由於缺乏權限,因此爲主數據庫指定的SQL字符串無法執行,因此安裝常常中止。是否可以導出SqlString編輯的字符串的結果?

我想編輯我的安裝程序,以便在無法執行SqlString元素時,應該跳過安裝的SQL部分。安裝完成後,我希望用戶能夠自己執行SQL語句。我的安裝程序採取的每個SQL操作都存儲在SqlString元素中。 SqlString元素包含很多在安裝過程中被替換的屬性。我想將所有編輯的SqlString元素的內容提取到存儲在用戶目錄中的一個sql文件中。

我想我必須寫一個在sqlextension取代屬性之後發生的習慣。然後我將不得不訪問這些改變的字符串。有什麼辦法可以做到這一點?

例的SqlString元素:SQL文件的

<sql:SqlDatabase Id="MasterDB" Server="[SQLSERVER_SERVER]" Instance="[SQLSERVER_INSTANCENAME]" Database="master" /> 

<sql:SqlString 
     SqlDb="MasterDB" 
     Id="CreateNetworkServiceAccount" 
     ExecuteOnInstall="yes" 
     ContinueOnError="no" 
     SQL="IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'{[WIX_ACCOUNT_NETWORKSERVICE]}') 
     CREATE LOGIN [\[]{[WIX_ACCOUNT_NETWORKSERVICE]}[\]] FROM WINDOWS WITH DEFAULT_DATABASE=[\[]master[\]]" 
     Sequence="101"/> 

例子,我想有後SqlStrings失敗:

USE master; 
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'NT AUTHORITY\Network Service') 
CREATE LOGIN [NT AUTHORITY\Network Service] FROM WINDOWS WITH DEFAULT_DATABASE=[master] 

回答

0

我已經解決了這個問題,一個相當奇怪的解決方案。我寫了一個CustomAction,它從SqlString表中提取字符串元素,然後用存儲在會話中的相應屬性替換格式化的字段。要訪問會話變量,CustomAction必須被執行爲immediate。我在InstallFinalize之前安排它可以訪問PersonalFolder屬性。有了這個屬性,我可以存儲一個Sql腳本,這些腳本是由用戶Documents目錄中的SqlScript表中的條目生成的。爲了說明安裝中的不同數據庫,我在SqlDatabase表中包含了一個查找。

下面是代碼到CustomAction:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Deployment.WindowsInstaller; 
using System.IO; 
using System.Text.RegularExpressions; 

namespace SaveSqlStrings 
{ 
    public class CustomActions 
    { 
     [CustomAction] 
     public static ActionResult SaveSqlStrings(Session session) 
     { 
      StringBuilder sqlStrings = new StringBuilder(); 
      Database db = session.Database; 
      View view = db.OpenView("SELECT * FROM `SqlString`"); 
      IList<string> SqlStringElements = db.ExecuteStringQuery("SELECT `String` FROM `SqlString`"); 
      Regex bracketedProperties = new Regex(@"\[(\b[A-Z_]*\b)\]"); 
      Regex formattedProperties = new Regex(@"{\[(\b[A-Z_]*\b)\]}"); 
      Regex openeningSquareBrackets = new Regex(@"\[\\\[\]"); 
      Regex closingSquareBrackets = new Regex(@"\[\\\]\]"); 
      string sqlDb_ = ""; 
      string sqlString = ""; 
      string Database = ""; 
      foreach (string dbString in SqlStringElements) 
      { 
       sqlDb_ = (string)db.ExecuteScalar("SELECT `SqlDb_` FROM `SqlString` WHERE `String` ='{0}'",dbString); 
       sqlString = (string)db.ExecuteScalar("SELECT `SQL` FROM `SqlString` WHERE `String` ='{0}'",dbString); 
       view.Close(); 
       view = db.OpenView("SELECT * FROM `SqlDatabase`"); 
       Database = (string)db.ExecuteScalar("SELECT `Database` from `SqlDatabase` WHERE `SqlDb`='{0}'", sqlDb_); 
       if(bracketedProperties.IsMatch(Database)) 
       { 
        Database = bracketedProperties.Match(Database).Groups[1].Value; 
        Database = session[Database]; 
       } 
       if (openeningSquareBrackets.IsMatch(sqlString)) 
        sqlString = openeningSquareBrackets.Replace(sqlString, "["); 
       if (closingSquareBrackets.IsMatch(sqlString)) 
        sqlString = closingSquareBrackets.Replace(sqlString, "]"); 
       if(formattedProperties.IsMatch(sqlString)) 
       { 
        string propertyName = formattedProperties.Match(sqlString).Groups[1].Value; 
        string propertyValue = session[propertyName]; 
        sqlString = formattedProperties.Replace(sqlString, propertyValue); 
       } 
       sqlStrings.AppendLine(String.Format("use {0}",Database)); 
       sqlStrings.AppendLine(sqlString); 
      } 
      string home = session["PersonalFolder"]; 
      string sqlPath = string.Concat(home, @"Script.sql"); 
      try 
      { 
       File.WriteAllText(sqlPath, sqlStrings.ToString()); 
      } 
      catch (Exception ex) 
      { 
       session["FailedTowrite"] = sqlPath; 
      } 
      view.Close(); 
      db.Close(); 
      return ActionResult.Success; 
     } 
    } 
} 
相關問題