2

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

4

1 に答える 1

4

デフォルトでは、 aComponent Conditionはインストール時にのみ評価されます。Conditionインストール パッケージが実行されるたびに評価する場合は、要素にTransitive='yes'属性を設定する必要があります。Component

ただし、私の経験では、アンインストール中にComponentMSI によってインストールされた場合、MSI がアンインストールされると削除されます。

MsiHiddenProperties、使用している SQL カスタム アクションに由来します。SQL 文字列にパスワードが含まれる場合があり、セキュリティの脆弱性を引き起こすログ ファイルにパスワードをプレーン テキストで保存したくないため、Windows インストーラーが SQL 文字列をログに記録できなくなります。

于 2013-04-16T14:14:22.517 に答える