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 はどこから来たのですか? アンインストールのプロパティを設定するにはどうすればよいですか?