是否可以导出SqlString编辑字符串的结果?
我有一个安装数据库的安装程序。数据库与一些登录名一起创建。为了创建登录,我正在使用SqlString元素中的主数据库。只有在SQL server上具有非常高权限的用户才能访问主数据库。通常,由于缺少权限,无法执行为主数据库指定的SQL字符串,因此安装会中止 我想编辑我的安装程序,以便在无法执行SqlString元素时,跳过安装的SQL部分。安装完成后,我希望用户能够自己执行SQL语句。我的安装程序执行的每个SQL操作都存储在SqlString元素中。SqlString元素包含许多在安装过程中被替换的属性。我想将所有编辑过的SqlString元素的内容提取到存储在用户目录中的一个sql文件中 我想我必须编写一个customaction,它发生在sqlextension替换属性之后。然后我必须访问这些修改过的字符串。我有什么办法可以做到这一点吗 示例SqlString元素:是否可以导出SqlString编辑字符串的结果?,sql,wix,wix-extension,database-installation,Sql,Wix,Wix Extension,Database Installation,我有一个安装数据库的安装程序。数据库与一些登录名一起创建。为了创建登录,我正在使用SqlString元素中的主数据库。只有在SQL server上具有非常高权限的用户才能访问主数据库。通常,由于缺少权限,无法执行为主数据库指定的SQL字符串,因此安装会中止 我想编辑我的安装程序,以便在无法执行SqlString元素时,跳过安装的SQL部分。安装完成后,我希望用户能够自己执行SQL语句。我的安装程序执行的每个SQL操作都存储在SqlString元素中。SqlString元素包含许多在安装过程中被替
<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"/>
我用一种相当奇怪的方法解决了这个问题。我编写了一个CustomAction,它从SqlString表中提取字符串元素,然后用存储在会话中的适当属性替换格式化字段。要访问会话变量,必须以
立即
的方式执行CustomAction。我已经在InstallFinalize
之前安排了访问PersonalFolder
属性的权限。有了这个属性,我就可以在users Documents目录中存储由SqlScript表中的条目生成的Sql脚本。为了说明安装中的不同数据库,我在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;
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Microsoft.Deployment.WindowsInstaller;
使用System.IO;
使用System.Text.RegularExpressions;
名称空间SaveSqlStrings
{
公共集体诉讼
{
[海关行动]
公共静态ActionResult SaveSqlStrings(会话)
{
StringBuilder sqlStrings=新的StringBuilder();
Database db=session.Database;
View=db.OpenView(“从`SqlString`中选择*”;
IList SqlStringElements=db.ExecuteStringQuery(“从`SqlString`中选择`String`”);
Regex-bracketedProperties=new Regex(@“\[(\b[A-Z\]*\b)\]”);
Regex formattedProperties=newregex(@“{\[(\b[A-Z\]*\b)\]}”);
正则表达式openeringsquare括号=新正则表达式(@“\[\\\\[\]”);
正则表达式closingsquare括号=新正则表达式(@“\[\\\]\]”);
字符串sqlDb_u=“”;
字符串sqlString=“”;
字符串数据库=”;
foreach(SqlStringElements中的字符串dbString)
{
sqlDb_=(string)db.ExecuteScalar(“从`SqlString`中选择`sqlDb_`WHERE`string`='{0}',dbString”);
sqlString=(string)db.ExecuteScalar(“从`sqlString`中选择`SQL`,其中`string`='{0}',dbString);
view.Close();
view=db.OpenView(“从`SqlDatabase`中选择*”;
Database=(string)db.ExecuteScalar(“从`SqlDatabase`中选择`Database`,其中`SqlDb`='{0}'”,SqlDb_);
if(bracketedProperties.IsMatch(数据库))
{
数据库=bracketedProperties.Match(数据库).Groups[1]。值;
数据库=会话[数据库];
}
if(openiningsquaresholds.IsMatch(sqlString))
sqlString=openiningsquarestores.Replace(sqlString,“[”);
if(ClosingSquare括号.IsMatch(sqlString))
sqlString=ClosingSquare括号。替换(sqlString,“]”);
if(formattedProperties.IsMatch(sqlString))
{
string propertyName=formattedProperties.Match(sqlString).Groups[1]。值;
字符串propertyValue=会话[propertyName];
sqlString=formattedProperties.Replace(sqlString,propertyValue);
}
AppendLine(String.Format(“使用{0}”,数据库));
AppendLine(sqlString);
}
字符串home=会话[“个人文件夹”];
string sqlPath=string.Concat(home,@“Script.sql”);
尝试
{
File.WriteAllText(sqlPath,sqlStrings.ToString());
}
捕获(例外情况除外)
{
会话[“FailedTowrite”]=sqlPath;
}
view.Close();
db.Close();
返回操作结果。成功;
}
}
}
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;
}
}
}