我创建了一个安装程序,它使用 WixSqlExtension 提供的 sqlstring 元素安装数据库。这是代码示例:
<ComponentGroup Id="DatabaseCreation" Directory="INSTALLFOLDER">
<Component Id="CreateDatabase" Guid="SOMEGUID" KeyPath="yes">
<sql:SqlString
Id="CreateDB"
Sequence="1"
ExecuteOnInstall="yes"
ContinueOnError="no"
SqlDb="MasterDB"
SQL="DECLARE @dbname nvarchar(128)
SET @dbname = N'{[SQLDATABASE]}'
IF(NOT EXISTS
(SELECT name
FROM master.dbo.sysdatabases
WHERE ('[\[]' + name + '[\]]') = @dbname
OR name = @dbname
)
)
CREATE DATABASE {[SQLDATABASE]}"
/>
</Component>
<Component Id="DropDatabase" Guid="ANOTHERGUID" KeyPath="yes">
<sql:SqlString
Id="DropDB"
Sequence="10000"
SqlDb="MasterDB"
ExecuteOnUninstall="yes"
ContinueOnError="no"
SQL="DECLARE @dbname nvarchar(128)
SET @dbname = N'{[SQLDATABASE]}'
IF(EXISTS
(SELECT name
FROM master.dbo.sysdatabases
WHERE ('[\[]' + name + '[\]]') = @dbname
OR name = @dbname
)
)
DROP DATABASE {[SQLDATABASE]}"/>
<Condition>
<![CDATA[DROPDATABASE = "1"]]>
</Condition>
</Component>
</ComponentGroup>
使用以下命令安装软件包后
msiexec /i package.msi /l*v install.log
数据库按预期创建。但是用命令卸载包
msiexec /x package.msi DROPDATABASE="1" /l*v uninstall.log
不会按预期删除数据库。奇怪的是,该属性似乎已设置,如 uninstall.log 中所述:
[...] MSI (s) (44:68) [14:42:12:442]: Command Line: DROPDATABASE=1 REMOVE=ALL CURRENTDIRECTORY=C:\install CLIENTUILEVEL=2 CLIENTPROCESSID=2532[...]
[...] MSI (s) (44:68) [14:42:12:462]: PROPERTY CHANGE: Adding DROPDATABASE property. Its value is '1'.[...]
[...]Property(S): MsiHiddenProperties = CreateDatabase;DropDatabase;ExecuteSqlStrings;RollbackCreateDatabase;RollbackExecuteSqlStrings[...]
[...]Property(S): DROPDATABASE = 1[...]
现在到最有趣的部分:使用以下命令安装软件包时:
msiexec /i package.msi DROPDATABASE="1" /l*v install.log
使用以下命令卸载软件包:
msiexec /x package.msi DROPDATABASE="0" /l*v uninstall.log
删除数据库。我不明白为什么会这样。此处,为 DROPDATABASE 属性传递了值“0”,但代码明确指出,仅当该属性的值设置为值“1”时才删除数据库。可以再次在日志文件中看到该值的分配:
[...]MSI (s) (44:44) [14:49:12:587]: PROPERTY CHANGE: Adding DROPDATABASE property. Its value is '0'.[...]
为什么卸载时忽略 DROPDATABASE 属性?MsiHiddenProperties 来自哪里?如何设置卸载属性?