Почему свойства игнорируются при удалении, если они не были установлены при установке?

Я создал программу установки, которая устанавливает базу данных, используя элемент 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 ответ

Решение

По умолчанию ComponentCondition оценивается только во время установки. Если вы хотите Condition оценивается каждый раз, когда выполняется установочный пакет, вам нужно установить Transitive='yes' атрибут на Component элемент.

Однако, по моему опыту, во время удаления, если Component был установлен MSI, он будет удален при удалении MSI.

MsiHiddenProperties происходит от пользовательских действий SQL, которые вы используете. Они не позволяют установщику Windows регистрировать строки SQL, потому что иногда в строках SQL есть пароли, и вы не хотите, чтобы пароли в виде простого текста в файле журнала вызывали уязвимость системы безопасности.

Другие вопросы по тегам