初试WIX加SQL LocalDB
最近有个项目需要生成一个自动打包安装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
<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 =""[POWERSHELLEXE]" -Version 2.0 -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command "& '[#SetupDatabase]' ; exit $$($Error.Count)"" />
问题二:
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 中对应的变量写法如下:
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密码
代码实现:
' 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'"
以上是本人实践的一些方法和遇到的问题及解决方案,可能不是最佳解决方案,但确实可运行\可工作的方案。
如有问题或建议,希望能和大家探讨,同时也希望本文能帮到一部分人~~
初试WIX加SQL LocalDB的更多相关文章
- VS2017使用 SQL Localdb问题两则
VS2017使用 SQL Localdb问题两则 来博客园不算短了,总是索取者.最近使用VS2017,遇到一些问题,在解决时总是找不到拿来就能用的解决方案,在多方寻找,自行探索下,总算圆满解决,在这 ...
- TOP字句加SQL变量的相关问题
SQL Server数据库中的变量可以加载TOP字句之后,下文将对TOP字句加SQL变量的相关问题进行讨论,供您参考,希望对您学习SQL数据库有所帮助. SQL Server2005开始,TOP子句后 ...
- sql LocalDB 的安装环境和使用方法
LocalDB LocalDB专门为开发商.它是非常容易安装,无需管理,但它提供了相同的T-SQL语言,编程表面和客户端供应商定期的SQL Server Express.实际上,目标SQL Serve ...
- SQL localdb 连接字符串
http://blog.csdn.net/greystar/article/details/47699797 原来SQL 2012 下连接LOCALDB,字符串为: Data Source=(Loca ...
- 初试PHP连接sql server
最开始想使用 pdo_sqlsrv 拓展,但是一直没成功,本文采用的是 pdo_dblib + freetds. 环境:CentOS 6.8.PHP 5.6.20 freetds wget ftp:/ ...
- SQL注入:突破关键字过滤
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败).回车的ascii ...
- 测试常用SQL注入语句大全
转载自Cracer,标题:<渗透常用SQL注入语句大全>,链接http://www.xxxx.com/?p=2226 1.判断有无注入点 整形参数判断 1.直接加' 2.and 1=1 3 ...
- 记一次苦逼的SQL查询优化
最近在维护公司项目时,需要加载某页面,总共加载也就4000多条数据,竟然需要35秒钟,要是数据增长到40000条,我估计好几分钟都搞不定.卧槽,要我是用户的话估计受不了,趁闲着没事,就想把它优化一下, ...
- Sql存储过程解密方法
在网上查到这样一个存储过程解密的方法,用起来简单,收藏到这里: )) AS ------------------------sql2000大于40000的----------------- --原作: ...
随机推荐
- windows10简单试用(多图,连薛定谔的猫都杀死了)
为了大家看起来方便,我的截图都是gif的,比较小,但是颜色会有色差,相信大家不介意的 昨天windows10可以下载第一时间就下了玩玩 由于是技术预览,所以不打算替换之前的系统,只装在虚拟机里玩玩就好 ...
- Spring Batch在大型企业中的最佳实践
在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...
- YY一下十年后的自己
ps:其实这篇文章的评论比文章本身更有意思,欢迎关注. 每到年底总是我最焦虑的时候,年龄越大情况越明显. 可能越长大越是对 时光的流逝 更有感触,有感触之后就会胡思乱想.所以随手开始写下这篇文章. 人 ...
- 使用R画地图数据
用R画地图数据 首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf.bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下. ...
- BoneCP 升级遇到的问题
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [c ...
- 与大家分享robotium一个小问题。Test run failed:Instrumentation run failed due to 'java.lang.ClassNotFoundException'
今天和大家分享robotium一个小问题. 我们在运行自已经搭好的框架时,有可能会出现一个找不到类的错误(如上图所示). 问题是重签名工具给出的activity有误,这时我们可以用Appt命令查看重签 ...
- 存储程序(1)——MYSQL
MySQL支持把几种对象存放在服务器端供以后使用.这几种对象有一些可以根据情况通过程序代码调用,有一些会在数据表被修改时自动执行,还有一些可以在预定时刻自动执行.它们包括以下几种: 1.存储函数(st ...
- 计算机程序的思维逻辑 (8) - char的真正含义
看似简单的char 通过前两节,我们应该对字符和文本的编码和乱码有了一个清晰的认识,但前两节都是与编程语言无关的,我们还是不知道怎么在程序中处理字符和文本. 本节讨论在Java中进行字符处理的基础 - ...
- ZFPlayer 源码解读
源码下载地址:https://github.com/renzifeng/ZFPlayer 之前自己实现过一个模仿百思不得姐的demo https://github.com/agelessman/FFm ...
- Linux平台oracle 11g单实例 安装部署配置 快速参考
1.重建主机的Oracle用户 组 统一规范 uid gid 以保证共享存储挂接或其他需求的权限规范 userdel -r oracle groupadd -g 7 oinstall groupadd ...