前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初试WIX加SQL LocalDB

初试WIX加SQL LocalDB

作者头像
麦克-堂
发布2018-04-12 15:46:33
1.3K0
发布2018-04-12 15:46:33
举报

最近有个项目需要生成一个自动打包安装App和数据库的MSI文件,经同事推荐WIX,于是乎就试了一试。遇到了一些问题觉得有分享的价值,所以写篇博客记录一下 :)

使用感觉:

WIX特点:功能很强大,用XML配置实现,没有界面,弹性很大,但learning curve比较长。

WIX貌似对LocalDB不支持,如果是其它版本的SQL Server,WIX有内置配置支持,很简单。

问题一:

WIX内置不支持SQL LocalDB,怎么实现对SQL LocalDB安装及配置

解决方案:

我的第一想法和现在的做法是用Powershell调用SQL Scripts,然后再用WIX调用Powershell

代码实现:

Powershell调用SQL Scripts

$dbName = 'LocalDBTest' $serverName = '(localdb)\localdbtest'

# determine path of script. all paths in script are relative to script file.

$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path

' setting up database...'

sqlcmd -U 'sa' -P 'test!123' -S $serverName -i "$scriptDir\.\LocalDBTestSchema.sql" -X

WIX 调用Powershell

代码语言:javascript
复制
<ComponentGroup Id="LocalDBTest_Project" Directory="LocalDBTest">
        <Component Id="SetupDatabase" Guid="8DE013D2-BB7D-4958-973A-3C54606D5CDC" KeyPath="yes">
          <File Id="SetupDatabase" Name="SetupDatabase.ps1" Source="$(var.ProjectDir)DB\SetupDatabase.ps1" Vital="yes" />
        </Component>
...
    </ComponentGroup>
    <!--Define the CustomAction for running the PowerShell script-->
    <CustomAction Id="RunPowerShellScript" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="yes" />
    <InstallExecuteSequence>
      <!--Invoke PowerShell script -->
      <Custom Action="RunPowerShellScript" After="InstallFiles"><![CDATA[NOT Installed]]></Custom>
    </InstallExecuteSequence>
    <!-- Ensure PowerShell is installed and obtain the PowerShell executable location -->
    <Property Id="POWERSHELLEXE">
      <RegistrySearch Id="POWERSHELLEXE"
                      Type="raw"
                      Root="HKLM"
                      Key="SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
                      Name="Path" />
    </Property>
    <Condition Message="This application requires Windows PowerShell.">
      <![CDATA[Installed OR POWERSHELLEXE]]>
    </Condition> 
    <!-- Define the PowerShell command invocation -->
    <SetProperty Id="RunPowerShellScript"
             Before ="InstallFiles"
             Sequence="execute"
             Value ="&quot;[POWERSHELLEXE]&quot; -Version 2.0 -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command &quot;&amp; '[#SetupDatabase]' ; exit $$($Error.Count)&quot;" />

问题二:

Window 7 对权限管控比较严,SQL Scripts对C:盘大多数目录没有创建文件的权限

解决方案:

查找了一下,发现%UserProfile%目录好像SQL有读写权限,因为我们程序首先需要安装LocalDB所以选择了以下目录

%UserProfile%\AppData\Local\Microsoft\Microsoft SQL Server Local DB

问题三:

怎么把一个%UserProfile%目录从Powershell中传给SQL Script使用

解决方案:

在Powershell中拿到%UserProfile%目录,然后调用Sqlcmd传给SQL Scripts

代码实现:

在Powershell中拿到%UserProfile%目录

$dbName = 'LocalTestDB'

$serverName = '(localdb)\localDBTest'

# get the user profile folder which no need access rights to create DB files

$userProfile = $env:USERPROFILE

$userProfile = $userProfile+'\AppData\Local\Microsoft\Microsoft SQL Server Local DB'

# 注意底下双引号和单引号的使用依次是 ,开始[单引][双引][单引],结束[双引][单引],这里折腾了我不少时间,地址老是传得不对

$RingDB = '"'+$userProfile+'\LocalTestDB.mdf"'

$RingLog = '"'+$userProfile+'\LocalTestDB_log.ldf"'

# determine path of script. all paths in script are relative to script file.

$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path

调用Sqlcmd传给SQL Scripts

' setting up database...'

#sqlcmd -U 'sa' -P 'test!123' -S $serverName -i "$scriptDir\.\LocalDBTestSchema.sql" -v varMDF= $RingDB varLDF= $RingLog

LocalDBTestSchema.sql 中对应的变量写法如下:

代码语言:javascript
复制
USE [master]
GO
/****** Object:  Database [LocalTestDB]    Script Date: 2014/4/1 12:24:09 ******/
CREATE DATABASE [LocalTestDB]
 CONTAINMENT = NONE
 ON  PRIMARY
( NAME = N'LocalTestDB', FILENAME = N'$(varMDF)' , SIZE = 15552KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON
( NAME = N'LocalTestDB_log', FILENAME = N'$(varLDF)' , SIZE = 76736KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

问题四:

LocalDB默认安装时没有界面的,用户不会用SQL Command去创建SQL instance和修改sa的密码,App怎么用sa连接数据库呢?

解决方案:

在Powershell中用Windows 集成登陆模式启用sa账号,然后修改sa密码

代码实现:

代码语言:javascript
复制
' Create instance for localDB'
SQLLocalDB create "LocalDBTest"
' Grant & Enable sa account'
sqlcmd -S $serverName -E -Q "GRANT CONNECT SQL TO [sa]"
sqlcmd -S $serverName -E -Q "ALTER LOGIN [sa] ENABLE"
' Change sa password'
sqlcmd -S $serverName -E -Q "EXEC sp_password NULL, 'test!123','sa'"

以上是本人实践的一些方法和遇到的问题及解决方案,可能不是最佳解决方案,但确实可运行\可工作的方案。

如有问题或建议,希望能和大家探讨,同时也希望本文能帮到一部分人~~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-04-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档