I have creeated an installer, which installs a database using the sqlstring element provided by the WixSqlExtension. Here is a sample of the code:
<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>
After installing the package with the following command
msiexec /i package.msi /l*v install.log
the database is created as expected. But uninstalling the package with the command
msiexec /x package.msi DROPDATABASE="1" /l*v uninstall.log
does not drop the database as expected. Curiously, the property seems to be set, as documented in 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[...]
Now to the most interesting part: When installing the package with the following command:
msiexec /i package.msi DROPDATABASE="1" /l*v install.log
uninstalling the package with the following command:
msiexec /x package.msi DROPDATABASE="0" /l*v uninstall.log
drops the database. I cannot understand why this is happening. Here, the value "0" is passed for the DROPDATABASE property, but the code clearly states to only drop the database when the value of this property is set to the value "1". The assignment of the value can be seen in the log file again:
[...]MSI (s) (44:44) [14:49:12:587]: PROPERTY CHANGE: Adding DROPDATABASE property. Its value is '0'.[...]
Why is the DROPDATABASE property ignored on uninstallation? Where do the MsiHiddenProperties come from? How do I set properties for an uninstallation?