[wix-users] Unable to Uninstall Patch

Edwin Castro egcastr at gmail.com
Mon Jun 4 08:49:31 PDT 2018


It is hard to follow multiple issues in the same thread.

This thread is started being about "Unable to Uninstall Patch". I have
little experience with patches but I have some educated guesses to follow
up on. I'll try your setup today/tonight and try to confirm what I think
I'm understanding. Of course, if anybody else already understands why this
particular setup doesn't allow uninstalling the patch then please feel free
to chime in. I'll respond to the question of patch uninstallation as soon
as I have something meaningful to share.

"In case if I add a separate component, then after the Patch installation,
the Uninstall option disappears." Can you provide the original Product.wxs
and new Product.wxs for this case? It sounds like the original Product.wxs
and description for updating it for the new msi is for the other issue.
Could you create a separate thread for that second issue? I want to
understand that question/issue better in isolation because I got confused
when presented here in this thread.

--
Edwin G. Castro


On Mon, Jun 4, 2018 at 8:11 AM, Ven H <venh.123 at gmail.com> wrote:

> No Edwin. What I mean is that, if I add this attribute, then only the
> SqlScript element with the modified sql statement runs during the Patch
> installation.
>
> In case if I add a separate component, then after the Patch installation,
> the Uninstall option disappears. This is a different issue. So, there are
> two different issues.
>
> Regards,
> Venkatesh
>
> On Mon, Jun 4, 2018 at 7:33 PM, Edwin Castro <egcastr at gmail.com> wrote:
>
>> Are you saying that with ExecuteOnReinstall="yes" you see the uninstall
>> option for the patch and without it you don't?
>>
>> --
>> Edwin G. Castro
>>
>>
>>
>>
>> On Mon, Jun 4, 2018, 03:06 Ven H <venh.123 at gmail.com> wrote:
>>
>>> One more quick point. In the Product.wxs above, if I added
>>> ExecuteOnReinstall="yes" also in addition to ExecuteOnInstall=yes, then it
>>> works during Patch also. But if I only have ExecuteOnInstall=yes, it
>>> doesn't work during Patch. Please test it without ExecuteOnReinstall=yes
>>> attribute. So, is this the solution? Is it correct? Please help.
>>>
>>> Regards,
>>> Venkatesh
>>>
>>> On Mon, Jun 4, 2018 at 3:18 PM, Ven H <venh.123 at gmail.com> wrote:
>>>
>>>> Thank you Edwin. Below is the complete detail.
>>>>
>>>> Basically, I have a Visual Studio MSI project with a Sample.txt and
>>>> CREATE_TABLE.sql files at the root level. The Sample.txt has a text "This
>>>> is version 1.0.0." and nothing else and the CREATE_TABLE.sql has an SQL
>>>> statement to create a table as below.
>>>>
>>>> use TestDB
>>>> go
>>>>
>>>> if not exists( select 1 from information_schema.tables where table_name
>>>> = 'EMPLOYEES' )
>>>> begin
>>>> create table dbo.EMPLOYEES
>>>> (
>>>> EMP_ID INT NOT NULL,
>>>> EMP_NAME NVARCHAR(100) NOT NULL
>>>> )
>>>> end
>>>> go
>>>>
>>>> Following is the markup of Product.wxs
>>>>
>>>> *Product.wxs*
>>>>
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="
>>>> http://schemas.microsoft.com/wix/UtilExtension" xmlns:sql="
>>>> http://schemas.microsoft.com/wix/SqlExtension">
>>>> <Product Id="F3374DBE-A524-44FA-9052-4C6F88249F10"
>>>> Name="DBPatchSample" Language="1033" Version="1.0.0.0"
>>>> Manufacturer="DB_Patch_Sample" UpgradeCode="42855AC1-CE52-436
>>>> 6-B419-83503155C417">
>>>> <Package InstallerVersion="200" Compressed="yes"
>>>> InstallScope="perMachine" />
>>>>
>>>> <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName]
>>>> is already installed." />
>>>> <MediaTemplate EmbedCab="yes" />
>>>>
>>>>     <util:User Id="SQLUser" Name="[SQLUSER]" Password="[SQLPASSWORD]" />
>>>>
>>>> <Binary Id="binCreateTbl" SourceFile="CREATE_TABLE.sql" />
>>>>
>>>>     <Property Id="MSIUSEREALADMINDETECTION" Value="1" />
>>>>     <Property Id="MSIFASTINSTALL" Value="1"/>
>>>>     <Property Id="MsiLogging" Value="v" />
>>>>     <Property Id="MSIENFORCEUPGRADECOMPONENTRULES" Value="1" />
>>>>     <Property Id="SQLSERVER" Value="ServerName"/>
>>>>     <Property Id="SQLINSTANCE" Value="InstanceName"/>
>>>>     <Property Id="SQLDB" Value="TestDB"/>
>>>>     <Property Id="SQLUSER" Value="sa"/>
>>>>     <Property Id="SQLPASSWORD" Value="Sa_Pwd"/>
>>>>
>>>> <Feature Id="ProductFeature" Title="DBPatchSample" Level="1">
>>>> <ComponentGroupRef Id="DbCG" />
>>>> </Feature>
>>>>     <UI Id="MyWixUI_Mondo">
>>>>       <UIRef Id="WixUI_Mondo" />
>>>>     </UI>
>>>>     <UIRef Id="WixUI_ErrorProgressText" />
>>>> </Product>
>>>>
>>>> <Fragment>
>>>> <Directory Id="TARGETDIR" Name="SourceDir">
>>>> <Directory Id="ProgramFilesFolder">
>>>> <Directory Id="INSTALLFOLDER" Name="DBPatchSample" />
>>>> </Directory>
>>>> </Directory>
>>>> </Fragment>
>>>>
>>>> <Fragment>
>>>> <ComponentGroup Id="DbCG">
>>>>       <Component Id="fileComp" Guid="92526A26-9404-449B-9EAA-7FC175F2EBE4"
>>>> Directory="INSTALLFOLDER" KeyPath="yes">
>>>>         <File Id="sampleTxt" Name="Sample.txt" Source="Sample.txt" />
>>>>       </Component>
>>>>       <Component Id="dbComp1" Guid="B4E70B72-DB9C-4215-B4DF-022B56A26C01"
>>>> Directory="INSTALLFOLDER" KeyPath="yes">
>>>>         <sql:SqlDatabase Id="msiTestDB1" Database="[SQLDB]"
>>>> Server="[SQLSERVER]" Instance="[SQLINSTANCE]" CreateOnInstall="yes"
>>>> User="SQLUser" />
>>>>         <sql:SqlScript BinaryKey="binCreateTbl" Id="script_CreateTbl"
>>>> ExecuteOnInstall="yes"  ExecuteOnReinstall="yes" ContinueOnError="no"
>>>> SqlDb="msiTestDB1" Sequence="1"  />
>>>>       </Component>
>>>> </ComponentGroup>
>>>> </Fragment>
>>>> </Wix>
>>>>
>>>> With this, I created an MSI and installed it. It does create the table
>>>> with the two columns in it. In the C:\Program Files(x86)\DBPatchSample
>>>> folder, I could find only the Sample.txt file and not the CREATE_TABLE.sql.
>>>> This is probably because the sql file is a binary and has been set to
>>>> execute on install.
>>>>
>>>> In my bin/debug folder, I created 3 folders namely 1.0.0, 1.0.1 and
>>>> Patch. Within 1.0.0 folder and 1.0.1 folders, I created a folder called
>>>> "admin". In the Patch folder, I copied my Patch.wxs, whose markup is as
>>>> given below. Then I moved the first MSI to 1.0.0 folder.
>>>>
>>>> *Patch.wxs *
>>>>
>>>> <?xml version="1.0" encoding="UTF-8"?><Wix xmlns="
>>>> http://schemas.microsoft.com/wix/2006/wi">
>>>>   <PatchCreation WholeFilesOnly="yes" CleanWorkingFolder="yes"
>>>> OutputPath="patch.pcp" Id="224C316C-5894-4771-BABF-21A3AC1F75FF">
>>>>     <PatchInformation Description="Patch Info Description"
>>>> Comments="Patch Info Comments" Manufacturer="DB_Patch_Sample"
>>>> Languages="1033" ShortNames="no" Compressed="yes"/>
>>>>     <PatchMetadata Description="Patch Metadata Description"
>>>> ManufacturerName="DB_Patch_Sample" MoreInfoURL="URL_Here"
>>>> AllowRemoval="yes" Classification="Update" DisplayName="DB Patch Sample
>>>> Patch" TargetProductName="DBPatchSample"/>
>>>>     <Family MediaSrcProp="Sample" SequenceStart="5000" DiskId="5000"
>>>> Name="Sample">
>>>>       <UpgradeImage SourceFile="D:\MyProjects\WIX\
>>>> DBPatchSample\bin\Debug\1.0.1\admin\DBPatchSample.msi"
>>>> Id="SampleUpgrade">
>>>>         <TargetImage Order="2" IgnoreMissingFiles="no"
>>>> SourceFile="D:\MyProjects\WIX\DBPatchSample\bin\Debug\1.0.0\admin\DBPatchSample.msi"
>>>> Id="SampleTarget"/>
>>>>       </UpgradeImage>
>>>>     </Family>
>>>>     <PatchSequence Supersede="yes" PatchFamily="SamplePatchFamily"
>>>> Sequence="1.0.0.0"/>
>>>>   </PatchCreation>
>>>> </Wix>
>>>>
>>>>
>>>> Now, to create the 1.0.1, I only updated the CREATE_TABLE.sql as below.
>>>>
>>>> use TestDB
>>>> go
>>>>
>>>> ALTER TABLE dbo.EMPLOYEES
>>>> ADD LAST_NAME nvarchar(100)
>>>>
>>>> This is the only change. I also update the Version in Product.wxs to
>>>> 1.0.1. That's it. I rebuilt this MSI and moved it inside 1.0.1 folder.
>>>>
>>>> Then I ran the following commands to create the Patch in a command
>>>> prompt after changing to the appropriate directory (I am using PCP approach
>>>> for Patch).
>>>>
>>>> msiexec.exe /a 1.0.0\DBPatchSample.msi /qb
>>>> TARGETDIR=D:\MyProjects\WIX\DBPatchSample\bin\Debug\1.0.0\admin
>>>>
>>>> msiexec.exe /a 1.0.1\DBPatchSample.msi /qb
>>>> TARGETDIR=D:\MyProjects\WIX\DBPatchSample\bin\Debug\1.0.1\admin
>>>>
>>>> candle.exe Patch\patch.wxs
>>>>
>>>> light.exe patch.wixobj -out patch\patch.pcp
>>>>
>>>> msimsp.exe -s patch\patch.pcp -p patch\patch.msp -l patch.log
>>>>
>>>> When I checked the Patch.log also, it is only try to compare the byte
>>>> content of Sample.txt and not CREATE_TABLE.sql, even though only the sql
>>>> file content has changed.
>>>>
>>>> After I install the patch, I can see the Update installed in ARP
>>>> Installed Updates, but the DB changes are not reflected. There are no
>>>> errors in the logs also. If I add the changes in a separate sql file within
>>>> a new component, then the DB changes are reflected, but the Uninstall
>>>> option in the ARP disappears. I am very confused. In case of SqlScript
>>>> element, the sql file is actually not present physically in the machine and
>>>> it gets executed during install. Hence I am not sure, if it is not able to
>>>> capture it as a change. I would humbly request you to try out the above
>>>> sample and check if it works or not and also please let me know what is
>>>> missing / incorrect above. Please help.
>>>>
>>>>
>>>> Regards,
>>>> Venkatesh
>>>>
>>>> On Sat, Jun 2, 2018 at 12:53 AM, Edwin Castro <egcastr at gmail.com>
>>>> wrote:
>>>>
>>>>> Use something like Orca or InstEdit to compare your old.msi and your
>>>>> new.msi. InstEdit has a "Compare Against..." menu item under the
>>>>> "Transform" menu which can help you see the differences easier. Look for
>>>>> new rows in the tables listed on the page linked by Rob. I would expect
>>>>> you're going to find new rows in one or more of those tables.
>>>>>
>>>>> --
>>>>> Edwin G. Castro
>>>>>
>>>>>
>>>>> On Fri, Jun 1, 2018 at 11:11 AM, Ven H via wix-users <
>>>>> wix-users at lists.wixtoolset.org> wrote:
>>>>>
>>>>>> Thank you very much, Rob. In my case, I have the MsiPatchMetadata
>>>>>> table in
>>>>>> the Patch.msp, when opened using Orca and the other conditions are
>>>>>> also
>>>>>> fine.
>>>>>>
>>>>>> So, it looks like I am not getting how Patch works with SqlScript
>>>>>> elements.
>>>>>> It will be great, if someone can please explain how to create Patch
>>>>>> for
>>>>>> SqlScript for DB. I couldn't find much info on that.
>>>>>>
>>>>>> Regards,
>>>>>> Venkatesh
>>>>>>
>>>>>> On Fri, Jun 1, 2018 at 9:57 PM, Rob Mensching via wix-users <
>>>>>> wix-users at lists.wixtoolset.org> wrote:
>>>>>>
>>>>>> > https://msdn.microsoft.com/en-us/library/windows/desktop/
>>>>>> > aa372102(v=vs.85).aspx
>>>>>> >
>>>>>> > _____________________________________________________________
>>>>>> >  Short replies here. Complete answers over there:
>>>>>> > http://www.firegiant.com/
>>>>>> >
>>>>>> > -----Original Message-----
>>>>>> > From: wix-users <wix-users-bounces at lists.wixtoolset.org> On Behalf
>>>>>> Of Ven
>>>>>> > H via wix-users
>>>>>> > Sent: Friday, June 1, 2018 6:22 AM
>>>>>> > To: WiX Toolset Users Mailing List <wix-users at lists.wixtoolset.org>
>>>>>> > Cc: Ven H <venh.123 at gmail.com>
>>>>>> > Subject: Re: [wix-users] Unable to Uninstall Patch
>>>>>> >
>>>>>> > So, I think I need to explain a little more. I have an MSI which
>>>>>> has a
>>>>>> > text file in a component and SqlScript element in a different
>>>>>> component. In
>>>>>> > this SqlScript element, I am creating a table with 2 columns. I
>>>>>> install
>>>>>> > this MSI and the text file is created and the SqlScript is executed
>>>>>> to
>>>>>> > create the table with 2 columns in the Database.
>>>>>> >
>>>>>> > Now, I am adding another SqlScript element (here I am creating
>>>>>> another
>>>>>> > table with 2 columns) in a new component and also making a slight
>>>>>> change in
>>>>>> > the sample text file. With this, I create the patch using the Patch
>>>>>> > Creation Properties approach. The patch gets created successfully
>>>>>> and also
>>>>>> > gets installed. After installation, I can see the new table created
>>>>>> and the
>>>>>> > sample text file modified. But now, when I go to Installed Updates,
>>>>>> the
>>>>>> > Uninstall option is missing for this patch, even though, I specify
>>>>>> > AllowRemoval=yes.
>>>>>> >
>>>>>> > Now, instead of adding another SqlScript element, if I just modify
>>>>>> the
>>>>>> > existing SqlScript (I mean the binary sql file content), by
>>>>>> altering the
>>>>>> > table or adding another create table statement inside it, the patch
>>>>>> doesn't
>>>>>> > seem to apply these changes, although, now the Uninstall option is
>>>>>> > available and I can uninstall the patch. I am not able to
>>>>>> understand this.
>>>>>> >
>>>>>> > So, I have a couple of questions.
>>>>>> >
>>>>>> > 1. Why does the Uninstall option disappear for a Patch when a new
>>>>>> > Component is added? I am actually not removing a component, but
>>>>>> adding one.
>>>>>> > So, I am not sure, if I am breaking the Component rules.
>>>>>> >
>>>>>> > 2. How do we Patch SqlScript elements? It is possible that, after
>>>>>> > installation, the developer will make a small change in one of the
>>>>>> sql
>>>>>> > files. For this small change, I don't want to do a full upgrade.
>>>>>> >
>>>>>> > Please help.
>>>>>> >
>>>>>> >
>>>>>> > Regards,
>>>>>> > Venkatesh
>>>>>> >
>>>>>> > On Fri, Jun 1, 2018 at 4:28 PM, Ven H <venh.123 at gmail.com> wrote:
>>>>>> >
>>>>>> > > I am building a Patch using the Patch Creation Properties. I have
>>>>>> a
>>>>>> > > Patch.wxs in which there is a PatchMetadata element with
>>>>>> > > AllowRemoval="yes". Even then the Patch doesn't give me the
>>>>>> option to
>>>>>> > > uninstall in the Installed Updates. Can any one please help?
>>>>>> > >
>>>>>> > > FYI, please find the Patch.wxs mark up below.
>>>>>> > >
>>>>>> > > <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
>>>>>> > >   <PatchCreation WholeFilesOnly="yes" CleanWorkingFolder="yes"
>>>>>> > > OutputPath="patch.pcp" Id="224C316C-5894-4771-BABF-21A3AC1F75FF">
>>>>>> > >     <PatchInformation Description="!(loc.PatchDescription)"
>>>>>> > > Comments="!(loc.PatchDescription)" Manufacturer="$(var.Manufactur
>>>>>> er)"
>>>>>> > > Languages="!(loc.LANG)" ShortNames="no" Compressed="yes"/>
>>>>>> > >     <PatchMetadata Description="!(loc.PatchDescription)"
>>>>>> > > ManufacturerName="$(var.Manufacturer)" MoreInfoURL="URL"
>>>>>> > > *AllowRemoval="yes"* Classification="Update" DisplayName="!(loc.
>>>>>> > PatchDisplayName)"
>>>>>> > > TargetProductName="$(var.ProductName)"/>
>>>>>> > >     <Family MediaSrcProp="Sample" SequenceStart="5000"
>>>>>> DiskId="5000"
>>>>>> > > Name="Sample">
>>>>>> > >       <UpgradeImage SourceFile="Path\1.0.1\admin\New.msi"
>>>>>> > > Id="SampleUpgrade">
>>>>>> > >         <TargetImage Order="2" IgnoreMissingFiles="no"
>>>>>> > > SourceFile="Path\1.0.0\admin\old.msi" Id="SampleTarget"/>
>>>>>> > >       </UpgradeImage>
>>>>>> > >     </Family>
>>>>>> > >     <PatchSequence Supersede="yes" PatchFamily="SamplePatchFamily
>>>>>> "
>>>>>> > > Sequence="1.0.0.0"/>
>>>>>> > >   </PatchCreation>
>>>>>> > > </Wix>
>>>>>> > >
>>>>>> > >
>>>>>> >
>>>>>> > ____________________________________________________________
>>>>>> ________
>>>>>> > WiX Toolset Users Mailing List provided by FireGiant
>>>>>> > http://www.firegiant.com/
>>>>>> >
>>>>>> > ____________________________________________________________
>>>>>> ________
>>>>>> > WiX Toolset Users Mailing List provided by FireGiant
>>>>>> > http://www.firegiant.com/
>>>>>> >
>>>>>>
>>>>>> ____________________________________________________________________
>>>>>> WiX Toolset Users Mailing List provided by FireGiant
>>>>>> http://www.firegiant.com/
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>


More information about the wix-users mailing list