Почему свойства игнорируются при удалении, если они не были установлены при установке?
Я создал программу установки, которая устанавливает базу данных, используя элемент sqlstring, предоставляемый WixSqlExtension. Вот пример кода:
<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
сбрасывает базу данных. Я не могу понять, почему это происходит. Здесь значение "0" передается для свойства DROPDATABASE, но в коде четко указано, что нужно отбрасывать базу данных только в том случае, если для этого свойства установлено значение "1". Присвоение значения снова можно увидеть в файле журнала:
[...]MSI (s) (44:44) [14:49:12:587]: PROPERTY CHANGE: Adding DROPDATABASE property. Its value is '0'.[...]
Почему свойство DROPDATABASE игнорируется при удалении? Откуда взялись MsiHiddenProperties? Как мне установить свойства для удаления?
1 ответ
По умолчанию Component
Condition
оценивается только во время установки. Если вы хотите Condition
оценивается каждый раз, когда выполняется установочный пакет, вам нужно установить Transitive='yes'
атрибут на Component
элемент.
Однако, по моему опыту, во время удаления, если Component
был установлен MSI, он будет удален при удалении MSI.
MsiHiddenProperties
происходит от пользовательских действий SQL, которые вы используете. Они не позволяют установщику Windows регистрировать строки SQL, потому что иногда в строках SQL есть пароли, и вы не хотите, чтобы пароли в виде простого текста в файле журнала вызывали уязвимость системы безопасности.