<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>article How to extract changes from the Change Store (Write Table) and store them in a database using Qlik Automate in Official Support Articles</title>
    <link>https://community.qlik.com/t5/Official-Support-Articles/How-to-extract-changes-from-the-Change-Store-Write-Table-and/ta-p/2537848</link>
    <description>&lt;P&gt;This article explains how to extract changes from a&lt;FONT color="#339966"&gt;&lt;STRONG&gt; Change Store&lt;/STRONG&gt;&lt;/FONT&gt; by using the &lt;FONT color="#339966"&gt;&lt;STRONG&gt;Qlik Cloud Services connector&lt;/STRONG&gt;&lt;/FONT&gt; in&lt;STRONG&gt;&lt;FONT color="#339966"&gt; Qlik Automate&lt;/FONT&gt;&lt;/STRONG&gt; and how to sync them to a database.&lt;/P&gt;
&lt;P&gt;The example will use a MySQL database, but can easily be modified to use other database connectors supported in Qlik Automate, such as MSSQL, Postgres, AWS DynamoDB, AWS Redshift, Google BigQuery, Snowflake.&lt;/P&gt;
&lt;P&gt;The article also includes:&lt;/P&gt;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;Two automation examples you can download and import (see&amp;nbsp;&lt;A href="https://community.qlik.com/t5/Official-Support-Articles/Qlik-Automate-How-to-import-and-export-automations/ta-p/1781602" target="_blank" rel="noopener"&gt;Qlik Automate: How to import and export automations&lt;/A&gt;):
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;EM&gt;Automation Example to Extract Change Store History to MySQL Incremental.json&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Automation Example to Bulk Extract Change Store History to MySQL Incremental.json&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Configuration instructions for the examples&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Content&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;LI-TOC indent="15" liststyle="none" maxheadinglevel="4"&gt;&lt;/LI-TOC&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Prerequisites&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;A working Write Table with a set of editable columns and some example values already stored in it. More information about the Write Table chart can be found in&amp;nbsp;&lt;A href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Visualizations/WriteTable/Analyze/write-table.htm" target="_blank" rel="noopener"&gt;Write Table | help.qlik.com&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;A MySQL (or similar) database table with columns that match your editable columns.&lt;/LI&gt;
&lt;LI&gt;Setting up the database, extend your database with metadata fields:
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;: to store the user ID of the user who made a change&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt;: to store the datetime when a change was saved&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Here is an example of an empty database table for a change store with:&lt;/P&gt;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;a single PK “&lt;FONT face="courier new,courier"&gt;productId&lt;/FONT&gt;”&lt;/LI&gt;
&lt;LI&gt;editable columns are “&lt;FONT face="courier new,courier"&gt;AmountToOrder&lt;/FONT&gt;”, “&lt;FONT face="courier new,courier"&gt;Priority&lt;/FONT&gt;”, and “&lt;FONT face="courier new,courier"&gt;Note&lt;/FONT&gt;”.&lt;/LI&gt;
&lt;LI&gt;additional columns “&lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;” and “&lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt;”, which will be used to log user activity and merge separate changes into the same record&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="table example product id amounttoorder priority note userid updateat.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185565iAC59D842F9F1A3B1/image-size/large?v=v2&amp;amp;px=999" role="button" title="table example product id amounttoorder priority note userid updateat.png" alt="table example product id amounttoorder priority note userid updateat.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Creating the automation&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;Create a new automation. See&amp;nbsp;&lt;A href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_QlikAutomation/introduction/home-automation.htm" target="_blank" rel="noopener"&gt;Qlik Automate&lt;/A&gt;&amp;nbsp;for details.&lt;/LI&gt;
&lt;LI&gt;Add the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt; from the &lt;STRONG&gt;Qlik Cloud Services&lt;/STRONG&gt; connector.&lt;/LI&gt;
&lt;LI&gt;Configure this block with the &lt;STRONG&gt;change store ID&lt;/STRONG&gt;. You can copy this from the &lt;STRONG&gt;write table chart&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Perform a manual run of the automation to make sure some records are returned. The &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt; will return a list of objects for each cell that contains one or more changes. Every object includes the combination of primary key(s), the editable column for that cell, and a list of all values belonging to that cell.&lt;/LI&gt;
&lt;LI&gt;You have two options on how to perform this sync:
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;STRONG&gt;Insert changes one by one&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Insert changes in bulk&lt;/STRONG&gt; (this option is more complex but also more performant)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Insert changes in MySQL one by one&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Loop block&lt;/STRONG&gt;&amp;nbsp;(&lt;STRONG&gt;A&lt;/STRONG&gt;)inside the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt; and configure it to loop over the list of changes inside each object returned by the &lt;STRONG&gt;List Change Store History block&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;)&amp;nbsp;:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add loop block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185567iDEFF9792ECDAB1B8/image-size/large?v=v2&amp;amp;px=999" role="button" title="add loop block.png" alt="add loop block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="list change storey history item changes.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185568i7D0C7C2D0450817C/image-size/large?v=v2&amp;amp;px=999" role="button" title="list change storey history item changes.png" alt="list change storey history item changes.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;Search for the&lt;STRONG&gt; MySQL connector&lt;/STRONG&gt; (&lt;STRONG&gt;A&lt;/STRONG&gt;)&amp;nbsp;in the automation block library and drag the &lt;STRONG&gt;Upsert Record block&lt;/STRONG&gt; inside the &lt;STRONG&gt;Loop block &lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;) :&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="search mysql connector.png" style="width: 486px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185569i18B920E960D41205/image-dimensions/486x478?v=v2" width="486" height="478" role="button" title="search mysql connector.png" alt="search mysql connector.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add upsert record.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185570i686168EAC2A13815/image-size/large?v=v2&amp;amp;px=999" role="button" title="add upsert record.png" alt="add upsert record.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Create a new connection&lt;/STRONG&gt; (&lt;STRONG&gt;C&lt;/STRONG&gt;) to your MySQL database in the &lt;STRONG&gt;Connection&lt;/STRONG&gt; tab of the &lt;STRONG&gt;Upsert Record block&lt;/STRONG&gt; and activate it for the block by clicking it once created.&lt;/LI&gt;
&lt;LI&gt;Configure the &lt;STRONG&gt;Upsert Record&lt;/STRONG&gt; &lt;STRONG&gt;block&lt;/STRONG&gt; as follows
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;STRONG&gt;Table&lt;/STRONG&gt;: the &lt;STRONG&gt;database table&lt;/STRONG&gt; you have created for the &lt;STRONG&gt;Write Table&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Where&lt;/STRONG&gt;: the &lt;FONT face="courier new,courier"&gt;key:value&lt;/FONT&gt; mappings for the granularity on which you want to save the changes. In this example, it is a combination of the primary key (&lt;FONT face="courier new,courier"&gt;productId&lt;/FONT&gt;) with &lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt; and &lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt;.&lt;BR /&gt;&lt;BR /&gt;
&lt;OL class="lia-list-style-type-lower-alpha"&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;productId &lt;/FONT&gt;(primary key): this comes from the &lt;FONT face="courier new,courier"&gt;cellKey&lt;/FONT&gt; in the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt;.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="upsert record table setup productID.png" style="width: 634px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185585i8E92CF1993B8226A/image-dimensions/634x779?v=v2" width="634" height="779" role="button" title="upsert record table setup productID.png" alt="upsert record table setup productID.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt; and &lt;FONT face="courier new,courier"&gt;createdAt&lt;/FONT&gt;: these are defined for each change, so they should be retrieved from the item in the &lt;STRONG&gt;Loop block&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;The &lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt; maps to the &lt;FONT face="courier new,courier"&gt;createdBy&lt;/FONT&gt; parameter.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="upsert record table setup userID createdBy.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185586iCE5AABDF1D2D6181/image-size/large?v=v2&amp;amp;px=999" role="button" title="upsert record table setup userID createdBy.png" alt="upsert record table setup userID createdBy.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="upsert record table setup userID updatedAt.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185587iA8BB32191DFB751E/image-size/large?v=v2&amp;amp;px=999" role="button" title="upsert record table setup userID updatedAt.png" alt="upsert record table setup userID updatedAt.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Record&lt;/STRONG&gt;: this is the &lt;FONT face="courier new,courier"&gt;key:value&lt;/FONT&gt; mapping for the individual change that should get updated. The &lt;STRONG&gt;Key&lt;/STRONG&gt; maps to the &lt;FONT face="courier new,courier"&gt;columnName&lt;/FONT&gt; that is returned by the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt;, the &lt;STRONG&gt;Value&lt;/STRONG&gt; maps to the &lt;FONT face="courier new,courier"&gt;cellValue&lt;/FONT&gt; parameter that is returned in the &lt;STRONG&gt;Loop block&lt;/STRONG&gt;:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="upsert record table setup key value.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185588i0D7A7B83FF8B8365/image-size/large?v=v2&amp;amp;px=999" role="button" title="upsert record table setup key value.png" alt="upsert record table setup key value.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;This is what your automation will look like now:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="insert changes in mysql one by one - finished automation.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185590iA986B5C1E42BBF59/image-size/large?v=v2&amp;amp;px=999" role="button" title="insert changes in mysql one by one - finished automation.png" alt="insert changes in mysql one by one - finished automation.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Run the automation manually by clicking the Run button in the automation editor and review that you have records showing in the MySQL table:&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="insert changes in mysql one by one - finished automation records example.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185591i8B7884AC06CABB00/image-size/large?v=v2&amp;amp;px=999" role="button" title="insert changes in mysql one by one - finished automation records example.png" alt="insert changes in mysql one by one - finished automation records example.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;Making this incremental&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Currently, there is no incremental version yet for the Get Change Store History block. While this is on our roadmap, the automation from this article can be extended to do incremental loads, by first retrieving the highest updatedAt value from the MySQL table. The below steps explain how the automation can be extended:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Do Query block&lt;/STRONG&gt; from the &lt;STRONG&gt;MySQL connector&lt;/STRONG&gt; to the automation and configure the query as follows:&lt;BR /&gt;
&lt;PRE&gt;SELECT MAX(updatedAT) FROM &amp;lt;your database table&amp;gt;&lt;/PRE&gt;
&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Incremental - add Do Query Block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185592iE4DC2991BF98BA0E/image-size/large?v=v2&amp;amp;px=999" role="button" title="Incremental - add Do Query Block.png" alt="Incremental - add Do Query Block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Run a test run of the automation without the other blocks attached to verify the result in the &lt;STRONG&gt;Do Query&lt;/STRONG&gt; block’s &lt;STRONG&gt;History&lt;/STRONG&gt; tab:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Incremental - test run.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185593iE771DA0EC394792D/image-size/large?v=v2&amp;amp;px=999" role="button" title="Incremental - test run.png" alt="Incremental - test run.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Condition&lt;/STRONG&gt; &lt;STRONG&gt;block&lt;/STRONG&gt; (&lt;STRONG&gt;A&lt;/STRONG&gt;)&amp;nbsp;to the automation and configure it to evaluate the &lt;FONT face="courier new,courier"&gt;MAX(updatedAt)&lt;/FONT&gt;&amp;nbsp;(&lt;STRONG&gt;B&lt;/STRONG&gt;) field from the &lt;STRONG&gt;Do Query block&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;Because the &lt;STRONG&gt;Do Query&lt;/STRONG&gt; block returns the value as part of a list, the automation editor prompts you to specify which item of the list you want to use. Use the default version option &lt;STRONG&gt;Select first item from list&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;C&lt;/STRONG&gt;).&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Incremental - add a condition.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185594iD5BB7D9A36171956/image-size/large?v=v2&amp;amp;px=999" role="button" title="Incremental - add a condition.png" alt="Incremental - add a condition.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="select first item from list.png" style="width: 517px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185595i248CFB8A722D989E/image-dimensions/517x555?v=v2" width="517" height="555" role="button" title="select first item from list.png" alt="select first item from list.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Configure the operator in the &lt;STRONG&gt;Condition&lt;/STRONG&gt; &lt;STRONG&gt;block&lt;/STRONG&gt; to &lt;STRONG&gt;is not empty&lt;/STRONG&gt;. If an&amp;nbsp;&lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt; timestamp is found, the &lt;STRONG&gt;Yes&lt;/STRONG&gt; part of the &lt;STRONG&gt;Condition&lt;/STRONG&gt; &lt;STRONG&gt;block&lt;/STRONG&gt; will be executed. If no timestamp is found, the &lt;STRONG&gt;No&lt;/STRONG&gt; part will be executed.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="do query is not empty.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185596iE363E7C24BA549E4/image-size/large?v=v2&amp;amp;px=999" role="button" title="do query is not empty.png" alt="do query is not empty.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Variable block&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;A&lt;/STRONG&gt;)to the &lt;STRONG&gt;Yes&lt;/STRONG&gt; part of the &lt;STRONG&gt;Condition&lt;/STRONG&gt; &lt;STRONG&gt;block&lt;/STRONG&gt; and create a new variable of type &lt;STRONG&gt;String&lt;/STRONG&gt; named &lt;STRONG&gt;Filter&lt;/STRONG&gt;. The setting is accessed from the &lt;STRONG&gt;Manage variables&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;)&amp;nbsp;button in the&amp;nbsp;&lt;STRONG&gt;Variables&amp;nbsp;&lt;/STRONG&gt;block.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add variables.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185597iABD7B9A3754562EC/image-size/large?v=v2&amp;amp;px=999" role="button" title="add variables.png" alt="add variables.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="filter string.png" style="width: 627px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185598i120671E2269A93D8/image-dimensions/627x397?v=v2" width="627" height="397" role="button" title="filter string.png" alt="filter string.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Add an &lt;STRONG&gt;operation&lt;/STRONG&gt; to the &lt;STRONG&gt;Variable block&lt;/STRONG&gt; to &lt;STRONG&gt;Set value&lt;/STRONG&gt; &lt;STRONG&gt;of Filter&lt;/STRONG&gt; and type &lt;FONT face="courier new,courier"&gt;updatedAt gt “&lt;/FONT&gt; in the input field.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="operations on filter.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185599i38A73142E07CF1DE/image-size/large?v=v2&amp;amp;px=999" role="button" title="operations on filter.png" alt="operations on filter.png" /&gt;&lt;/span&gt; &lt;BR /&gt;&lt;BR /&gt;Click in the input field to add a reference to the timestamp in the &lt;STRONG&gt;Do Query block,&lt;/STRONG&gt; mirroring the &lt;STRONG&gt;Condition block&lt;/STRONG&gt;&amp;nbsp;configuration.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="output from do query.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185600iCDB3D421B2888B3A/image-size/large?v=v2&amp;amp;px=999" role="button" title="output from do query.png" alt="output from do query.png" /&gt;&lt;/span&gt; &lt;BR /&gt;&lt;BR /&gt;After the mapping is added, append it with an additional double quote character:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add double quotes.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185601iDB4A341DF6432726/image-size/large?v=v2&amp;amp;px=999" role="button" title="add double quotes.png" alt="add double quotes.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Right-click the &lt;STRONG&gt;Variable block&lt;/STRONG&gt;&amp;nbsp;and duplicate it, then add the duplicated block to the&amp;nbsp;&lt;STRONG&gt;No&lt;/STRONG&gt; part of the &lt;STRONG&gt;Condition&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;A&lt;/STRONG&gt;). &lt;BR /&gt;&lt;BR /&gt;Remove the &lt;STRONG&gt;Set value of Filter&lt;/STRONG&gt; step and replace it with the &lt;STRONG&gt;Empty Variable&lt;/STRONG&gt;&amp;nbsp;(&lt;STRONG&gt;B&lt;/STRONG&gt;) operation. &lt;BR /&gt;&lt;BR /&gt;Right-click each Variable block and add a comment explaining the respective function.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="duplicate variable block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185602i4836843B3D222057/image-size/large?v=v2&amp;amp;px=999" role="button" title="duplicate variable block.png" alt="duplicate variable block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Reattach the original automation after the &lt;STRONG&gt;Condition block.&lt;/STRONG&gt;&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Verify that it is attached after the block and not inside the &lt;EM&gt;Yes&amp;nbsp;&lt;/EM&gt;or&amp;nbsp;&lt;EM&gt;No&amp;nbsp;&lt;/EM&gt;sections.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="reattach.png" style="width: 469px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185603i12B45455AC6F3DC3/image-size/large?v=v2&amp;amp;px=999" role="button" title="reattach.png" alt="reattach.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;In the&amp;nbsp;&lt;STRONG&gt;List Change Store History block&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;A&lt;/STRONG&gt;),&amp;nbsp;map the &lt;STRONG&gt;Filter&lt;/STRONG&gt; variable to the &lt;STRONG&gt;Filter parameter&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;)&amp;nbsp;:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add filter variable in list change store history block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185604i34EEBA34425A6229/image-size/large?v=v2&amp;amp;px=999" role="button" title="add filter variable in list change store history block.png" alt="add filter variable in list change store history block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Run the automation and confirm it only picks up new changes on new runs.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Bulk updates&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;The solution documented in the previous section will execute the &lt;STRONG&gt;Upsert Record&lt;/STRONG&gt; block once for each cell with changes in the change store. This may create too much traffic for some use cases. To address this, the automation can be extended to support bulk operations and insert multiple records in a single database operation.&lt;/P&gt;
&lt;P&gt;The approach is to transform the output of the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt; from a &lt;STRONG&gt;nested list of changes&lt;/STRONG&gt; into a &lt;STRONG&gt;list of records that contains the changes grouped by primary key&lt;/STRONG&gt;, &lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;, and &lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt; timestamp.&lt;/P&gt;
&lt;P&gt;See the attached automation example:&amp;nbsp; &lt;EM&gt;Automation Example to Bulk Extract Change Store History to MySQL Incremental.json.&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Drag the &lt;STRONG&gt;Loop&lt;/STRONG&gt; and &lt;STRONG&gt;Upsert Record block&lt;/STRONG&gt; outside the &lt;STRONG&gt;List Change Store History loop&lt;/STRONG&gt;, but do not delete them:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="detach loop and upsert.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185605i9D4977CDFB48B81E/image-size/large?v=v2&amp;amp;px=999" role="button" title="detach loop and upsert.png" alt="detach loop and upsert.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Variable block&lt;/STRONG&gt; inside the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt; loop (&lt;STRONG&gt;A&lt;/STRONG&gt;) and create a new variable &lt;STRONG&gt;partialChangeRecord&lt;/STRONG&gt; of type &lt;STRONG&gt;Object&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;). &lt;BR /&gt;&lt;BR /&gt;This variable will be used to map each cell value to the primary key(s), &lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;&amp;nbsp;and &lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt; timestamp.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="variable partialchangerecord.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185606iD92EB16B18517B51/image-size/large?v=v2&amp;amp;px=999" role="button" title="variable partialchangerecord.png" alt="variable partialchangerecord.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add the first operation to the &lt;STRONG&gt;Variable&lt;/STRONG&gt; to &lt;STRONG&gt;Empty&lt;/STRONG&gt; it (&lt;STRONG&gt;A&lt;/STRONG&gt;). &lt;BR /&gt;&lt;BR /&gt;This is important to ensure that for every item in the loop, we start with&lt;STRONG&gt; an empty&lt;/STRONG&gt; &lt;STRONG&gt;partialChangeRecord&lt;/STRONG&gt; variable. &lt;BR /&gt;&lt;BR /&gt;Next, add a &lt;STRONG&gt;Set key/values&lt;/STRONG&gt; operation to set the primary key(s) (&lt;STRONG&gt;B&lt;/STRONG&gt;). &lt;BR /&gt;&lt;BR /&gt;In our example, we have a single primary key,&amp;nbsp;&lt;FONT face="courier new,courier"&gt;productId,&lt;/FONT&gt; but if you have multiple fields, you should add them one by one.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="variable partialchangerecord in empty variable and key value.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185608i77F1E804B817AAF9/image-size/large?v=v2&amp;amp;px=999" role="button" title="variable partialchangerecord in empty variable and key value.png" alt="variable partialchangerecord in empty variable and key value.png" /&gt;&lt;/span&gt; &lt;BR /&gt;&lt;BR /&gt;Set it to the &lt;STRONG&gt;cellKey.rowKey&lt;/STRONG&gt; parameter returned in the output from &lt;STRONG&gt;List Change Store History&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="variable partialchangerecord in cellkey.png" style="width: 918px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185607iA64725D5ED650DE8/image-size/large?v=v2&amp;amp;px=999" role="button" title="variable partialchangerecord in cellkey.png" alt="variable partialchangerecord in cellkey.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Drag the &lt;STRONG&gt;Loop block&lt;/STRONG&gt; back into the automation and attach it to the &lt;STRONG&gt;Variable block&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;Disconnect the &lt;STRONG&gt;Upsert Record block&lt;/STRONG&gt;.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="attach loop block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185609i3BAE24BF91331089/image-size/large?v=v2&amp;amp;px=999" role="button" title="attach loop block.png" alt="attach loop block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add a new &lt;STRONG&gt;Variable block&lt;/STRONG&gt; inside the &lt;STRONG&gt;Loop block&lt;/STRONG&gt; and configure the &lt;STRONG&gt;Variable parameter&lt;/STRONG&gt; to the &lt;STRONG&gt;partialChangeRecord&lt;/STRONG&gt; object. &lt;BR /&gt;&lt;BR /&gt;Now set additional &lt;STRONG&gt;Key/values&lt;/STRONG&gt; in the variable for the primary &lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;, &lt;FONT face="courier new,courier"&gt;updatedAt,&lt;/FONT&gt; and the &lt;FONT face="courier new,courier"&gt;cellValue&lt;/FONT&gt;:&lt;BR /&gt;&lt;BR /&gt;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;: &lt;FONT face="courier new,courier"&gt;createdBy&lt;/FONT&gt; parameter returned in the loop&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt;: &lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt; parameter returned in the loop&lt;/LI&gt;
&lt;LI&gt;For the &lt;FONT face="courier new,courier"&gt;Cell&lt;/FONT&gt; &lt;FONT face="courier new,courier"&gt;value&lt;/FONT&gt;, set the key to the &lt;FONT face="courier new,courier"&gt;columnName&lt;/FONT&gt; returned by the&lt;STRONG&gt; List Change Store History block&lt;/STRONG&gt; and set the &lt;STRONG&gt;Value&lt;/STRONG&gt; to the &lt;FONT face="courier new,courier"&gt;cellValue&lt;/FONT&gt; returned from the &lt;STRONG&gt;Loop block&lt;/STRONG&gt;:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="operations on partialchangerecord.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185610i10D3DE47A12D7C8B/image-size/large?v=v2&amp;amp;px=999" role="button" title="operations on partialchangerecord.png" alt="operations on partialchangerecord.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;uniqueKey&lt;/FONT&gt;: add a fourth keyValue pair &lt;FONT face="courier new,courier"&gt;uniqueKey&lt;/FONT&gt;. &lt;BR /&gt;&lt;BR /&gt;This will be used later to merge various cell changes into a single record. &lt;BR /&gt;&lt;BR /&gt;This combines the primary key(s), &lt;FONT face="courier new,courier"&gt;userId,&lt;/FONT&gt; and &lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt; timestamp, each separated by a pipe (&lt;STRONG&gt;|&lt;/STRONG&gt;) symbol. &lt;BR /&gt;&lt;BR /&gt;Click the input field, map the first parameter, then type a &lt;STRONG&gt;|&lt;/STRONG&gt; &lt;STRONG&gt;-&lt;/STRONG&gt;symbol, and click the input field again to map the next parameter:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pipe symbol.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185611i7C5B69996F09812A/image-size/large?v=v2&amp;amp;px=999" role="button" title="pipe symbol.png" alt="pipe symbol.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="uniquekey.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185612iF9C4E9492185C3A3/image-size/large?v=v2&amp;amp;px=999" role="button" title="uniquekey.png" alt="uniquekey.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Add another &lt;STRONG&gt;Variable block&lt;/STRONG&gt; inside the &lt;STRONG&gt;Loop block&lt;/STRONG&gt;&amp;nbsp;(&lt;STRONG&gt;A&lt;/STRONG&gt;) and create a new list type variable&amp;nbsp;&lt;STRONG&gt;listOfPartialChanges&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;Add an &lt;STRONG&gt;Add item&lt;/STRONG&gt; operation to add the &lt;STRONG&gt;partialChangeRecord&lt;/STRONG&gt; variable (&lt;STRONG&gt;B&lt;/STRONG&gt;) to this list.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="variable listofpartialchanges.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185613i15220BFF1965749B/image-size/large?v=v2&amp;amp;px=999" role="button" title="variable listofpartialchanges.png" alt="variable listofpartialchanges.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Merge Lists block&lt;/STRONG&gt; after the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt;.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;The &lt;STRONG&gt;Merge Lists block&lt;/STRONG&gt; will be used to merge the partial change records into full records for each change. &lt;BR /&gt;&lt;BR /&gt;Configure both &lt;STRONG&gt;List parameters&lt;/STRONG&gt; in the&lt;STRONG&gt; Merge Lists block&lt;/STRONG&gt; to use the &lt;STRONG&gt;listOfPartialChanges&lt;/STRONG&gt; variable.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="merge lists.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185614i0428F0257AE7E81F/image-size/large?v=v2&amp;amp;px=999" role="button" title="merge lists.png" alt="merge lists.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Go to the &lt;STRONG&gt;Settings&lt;/STRONG&gt; tab of the &lt;STRONG&gt;Merge Lists block&lt;/STRONG&gt; and apply this configuration:&lt;BR /&gt;&lt;BR /&gt;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;STRONG&gt;Item merge strategy&lt;/STRONG&gt;: Merge list 1 item and list 2 item in one new item (default)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;List 1 unique key&lt;/STRONG&gt;: uniqueKey&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;List 2 unique key&lt;/STRONG&gt;: uniqueKey&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;On duplicate unique key&lt;/STRONG&gt;: Merge item from list 2 into item from list 1&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;When a property exists on both lists&lt;/STRONG&gt;: Keep value from list 1 (default)&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Due to an ongoing defect, this parameter is only available after refreshing the automation editor. As the parameters use the&amp;nbsp;&lt;STRONG&gt;default&amp;nbsp;&lt;/STRONG&gt;values, this should not impact you.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="merge lists settings.png" style="width: 580px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185615i68856F52490CA2E5/image-size/large?v=v2&amp;amp;px=999" role="button" title="merge lists settings.png" alt="merge lists settings.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Perform a manual run of the automation to verify that the &lt;STRONG&gt;Merge Lists block&lt;/STRONG&gt; output is merging.&lt;BR /&gt;&lt;BR /&gt;You will notice that this list contains many duplicates.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Deduplicate List block&lt;/STRONG&gt; (&lt;STRONG&gt;A&lt;/STRONG&gt;)&amp;nbsp;and configure the &lt;STRONG&gt;List parameter&lt;/STRONG&gt; to use the output from the &lt;STRONG&gt;Merge Lists block&lt;/STRONG&gt;, then set the key to &lt;FONT face="courier new,courier"&gt;uniqueKey &lt;/FONT&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;).&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="duplicate list.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185616i3D464057D2546D4B/image-size/large?v=v2&amp;amp;px=999" role="button" title="duplicate list.png" alt="duplicate list.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Perform another manual run and confirm that the &lt;STRONG&gt;Deduplicate List block&lt;/STRONG&gt; now only contains unique entries.&lt;/LI&gt;
&lt;LI&gt;The output still contains the &lt;FONT face="courier new,courier"&gt;uniqueKey&lt;/FONT&gt; parameter that is not compatible with the database.&lt;BR /&gt;&lt;BR /&gt;There are two options: either extend the database or remove&amp;nbsp;&lt;FONT face="courier new,courier"&gt;uniqueKey&lt;/FONT&gt;. &lt;BR /&gt;&lt;BR /&gt;To remove it, add a &lt;STRONG&gt;Transform List block&lt;/STRONG&gt; and set the &lt;STRONG&gt;Input List parameter&lt;/STRONG&gt; to the&lt;STRONG&gt; Deduplicate list block&lt;/STRONG&gt;:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="transform list.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185618iC4BB318E78C9330A/image-size/large?v=v2&amp;amp;px=999" role="button" title="transform list.png" alt="transform list.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Configure the &lt;STRONG&gt;Fields in output&lt;/STRONG&gt; list parameter from the &lt;STRONG&gt;Transform List block&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;To make this easier, it is best to have example data from a manual run. If you haven’t performed a manual run yet, do one now. &lt;BR /&gt;&lt;BR /&gt;Click the &lt;STRONG&gt;Add Field&lt;/STRONG&gt; button and configure new fields:&lt;BR /&gt;&lt;BR /&gt;
&lt;OL class="lia-list-style-type-lower-alpha"&gt;
&lt;LI&gt;For the &lt;STRONG&gt;Field&lt;/STRONG&gt; parameter, click the input field and start by mapping your primary keys&lt;BR /&gt;&lt;BR /&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="fields in outpust list productid.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185619i392905C5C007CBC6/image-size/large?v=v2&amp;amp;px=999" role="button" title="fields in outpust list productid.png" alt="fields in outpust list productid.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;For the &lt;STRONG&gt;Value&lt;/STRONG&gt; parameter, do the same and select the corresponding parameter in the &lt;STRONG&gt;Item in input list&lt;/STRONG&gt; option&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="product id item in input list.png" style="width: 993px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185620i2B7C3DEC5CE12305/image-size/large?v=v2&amp;amp;px=999" role="button" title="product id item in input list.png" alt="product id item in input list.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Repeat this for all other items in the list &lt;STRONG&gt;&lt;EM&gt;except&lt;/EM&gt; &lt;/STRONG&gt;for the &lt;FONT face="courier new,courier"&gt;uniqueKey&lt;/FONT&gt;&lt;BR /&gt;&lt;BR /&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="transform lists.png" style="width: 847px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185621i48560A54E1EEA12D/image-size/large?v=v2&amp;amp;px=999" role="button" title="transform lists.png" alt="transform lists.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Loop batch block&lt;/STRONG&gt;&amp;nbsp;(&lt;STRONG&gt;A&lt;/STRONG&gt;) to the automation and configure it to loop over the &lt;STRONG&gt;Transform List block output&lt;/STRONG&gt; in batches of &lt;STRONG&gt;50&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;). &lt;BR /&gt;&lt;BR /&gt;Adjust this batch size depending on your database and the number of editable columns.&lt;BR /&gt;&lt;BR /&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="loop batch.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185622iC9483E97ED984201/image-size/large?v=v2&amp;amp;px=999" role="button" title="loop batch.png" alt="loop batch.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Add an &lt;STRONG&gt;Insert Bulk block&lt;/STRONG&gt; from the MySQL connector within the &lt;STRONG&gt;Loop Batch block&lt;/STRONG&gt; loop. &lt;BR /&gt;&lt;BR /&gt;Configure it to use your database table variable (or hardcode your table name) and set the &lt;STRONG&gt;Values parameter&lt;/STRONG&gt; to the &lt;STRONG&gt;Batch in Loop Batch&lt;/STRONG&gt; parameter.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="insert bulk.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185623i592988EE3477D285/image-size/large?v=v2&amp;amp;px=999" role="button" title="insert bulk.png" alt="insert bulk.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Run the automation and confirm that the database gets updated.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="example output.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185624iD17622930B0A0EDA/image-size/large?v=v2&amp;amp;px=999" role="button" title="example output.png" alt="example output.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Optionally, collapse all empty loop blocks to clean up the automation and provide comments to explain what the blocks and functions do. &lt;BR /&gt;&lt;BR /&gt;This will help you understand this automation when you revisit it in the future. &lt;BR /&gt;&lt;BR /&gt;To add a comment, right-click on the block and click &lt;STRONG&gt;Edit comment&lt;/STRONG&gt;.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="commented blocks.png" style="width: 746px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185625i316C0B285FC51A0D/image-size/large?v=v2&amp;amp;px=999" role="button" title="commented blocks.png" alt="commented blocks.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Attachment configuration instructions&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;The provided automations will require additional configuration after being imported, such as changing the store, database, and primary key setup.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Automation Example to Extract Change Store History to MySQL Incremental.json&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;" value="1"&gt;&lt;SPAN&gt;Variable - databaseTable -&amp;gt; configure with the name of your database table&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Variable - changeStoreId -&amp;gt; configure with your change store ID&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Upsert Record - MySQL&amp;nbsp;-&amp;gt; replace the productId with your primary key, add additional primary keys if necessary&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Automation Example to Bulk Extract Change Store History to MySQL Incremental.json&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;" value="1"&gt;&lt;SPAN&gt;Variable - databaseTable -&amp;gt; configure with the name of your database table&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Variable - changeStoreId -&amp;gt; configure with your change store id &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Variable - partialChangeRecord -&amp;gt; replace the productId with your primary key, add additional primary keys if necessary&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Variable - partialChangeRecord in Loop block -&amp;gt; Update the uniqueKey field by replacing the productId with your primary key, add additional primary keys if necessary&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Transform List -&amp;gt; replace the productId with your primary key, add additional primary keys if necessary&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Bonus!&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;H4&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Replace field names&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H4&gt;
&lt;P&gt;If field names in the change store don't match the database (or another destination), the &lt;STRONG&gt;Replace Field Names In List block&lt;/STRONG&gt; can be used to translate the field names from one system to another.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Search the &lt;STRONG&gt;Replace Field Names List block&lt;/STRONG&gt; and add it to your automation.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="replace field names in list.png" style="width: 507px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185627iC816D28399390C77/image-dimensions/507x711?v=v2" width="507" height="711" role="button" title="replace field names in list.png" alt="replace field names in list.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Provide the &lt;STRONG&gt;translations&lt;/STRONG&gt;&amp;nbsp;for the field names that need to be changed to match the destination system.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="replace field names in list inputs.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185628iADF1112A60E97978/image-size/large?v=v2&amp;amp;px=999" role="button" title="replace field names in list inputs.png" alt="replace field names in list inputs.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H4&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;User email instead of user id&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H4&gt;
&lt;P&gt;To add a more readable parameter to track the user who made changes, the&lt;STRONG&gt; Get User block&lt;/STRONG&gt; from the &lt;STRONG&gt;Qlik Cloud Services connector&lt;/STRONG&gt; can be used to map User IDs into email addresses or names.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Search the &lt;STRONG&gt;Get user block&lt;/STRONG&gt;&amp;nbsp;(&lt;STRONG&gt;A&lt;/STRONG&gt;) in the &lt;STRONG&gt;Qlik Cloud services connector&lt;/STRONG&gt; and add it to your automation. &lt;BR /&gt;&lt;BR /&gt;Configure it to use the &lt;FONT face="courier new,courier"&gt;createdBy&lt;/FONT&gt; parameter (&lt;STRONG&gt;B&lt;/STRONG&gt;).&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="get user block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185629i447CD06EA967559A/image-size/large?v=v2&amp;amp;px=999" role="button" title="get user block.png" alt="get user block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Update the &lt;STRONG&gt;Upsert Record block&lt;/STRONG&gt; to use the output from &lt;STRONG&gt;Get User&lt;/STRONG&gt;.
&lt;BLOCKQUOTE class="quote"&gt;A user's name might not be sufficient as a unique identifier. Instead, combine it with a user ID or user email.&lt;/BLOCKQUOTE&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="upsert record get user.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185630iFE62021968A433D0/image-size/large?v=v2&amp;amp;px=999" role="button" title="upsert record get user.png" alt="upsert record get user.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H4&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Triggering the automation from a sheet&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H4&gt;
&lt;P&gt;Add a &lt;STRONG&gt;button chart object&lt;/STRONG&gt; to the sheet that contains the &lt;STRONG&gt;Write Table&lt;/STRONG&gt;, allowing users to start the automation from within the Qlik app. See&amp;nbsp;&lt;A href="https://community.qlik.com/t5/Official-Support-Articles/How-to-run-an-automation-with-custom-parameters-through-the-Qlik/ta-p/2496485" target="_blank" rel="noopener"&gt;How to run an automation with custom parameters through the Qlik Sense button&lt;/A&gt;&amp;nbsp;for more information.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add a button chart.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185631iA9C9126CEA88AFB9/image-size/large?v=v2&amp;amp;px=999" role="button" title="add a button chart.png" alt="add a button chart.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size="5" color="#339966"&gt;Environment&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;Qlik Cloud Analytics&lt;/LI&gt;
&lt;LI&gt;Qlik Automate&lt;/LI&gt;
&lt;/UL&gt;</description>
    <pubDate>Thu, 11 Dec 2025 13:00:53 GMT</pubDate>
    <dc:creator>Emile_Koslowski</dc:creator>
    <dc:date>2025-12-11T13:00:53Z</dc:date>
    <item>
      <title>How to extract changes from the Change Store (Write Table) and store them in a database using Qlik Automate</title>
      <link>https://community.qlik.com/t5/Official-Support-Articles/How-to-extract-changes-from-the-Change-Store-Write-Table-and/ta-p/2537848</link>
      <description>&lt;P&gt;This article explains how to extract changes from a&lt;FONT color="#339966"&gt;&lt;STRONG&gt; Change Store&lt;/STRONG&gt;&lt;/FONT&gt; by using the &lt;FONT color="#339966"&gt;&lt;STRONG&gt;Qlik Cloud Services connector&lt;/STRONG&gt;&lt;/FONT&gt; in&lt;STRONG&gt;&lt;FONT color="#339966"&gt; Qlik Automate&lt;/FONT&gt;&lt;/STRONG&gt; and how to sync them to a database.&lt;/P&gt;
&lt;P&gt;The example will use a MySQL database, but can easily be modified to use other database connectors supported in Qlik Automate, such as MSSQL, Postgres, AWS DynamoDB, AWS Redshift, Google BigQuery, Snowflake.&lt;/P&gt;
&lt;P&gt;The article also includes:&lt;/P&gt;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;Two automation examples you can download and import (see&amp;nbsp;&lt;A href="https://community.qlik.com/t5/Official-Support-Articles/Qlik-Automate-How-to-import-and-export-automations/ta-p/1781602" target="_blank" rel="noopener"&gt;Qlik Automate: How to import and export automations&lt;/A&gt;):
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;EM&gt;Automation Example to Extract Change Store History to MySQL Incremental.json&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Automation Example to Bulk Extract Change Store History to MySQL Incremental.json&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Configuration instructions for the examples&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Content&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;LI-TOC indent="15" liststyle="none" maxheadinglevel="4"&gt;&lt;/LI-TOC&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Prerequisites&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;A working Write Table with a set of editable columns and some example values already stored in it. More information about the Write Table chart can be found in&amp;nbsp;&lt;A href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Visualizations/WriteTable/Analyze/write-table.htm" target="_blank" rel="noopener"&gt;Write Table | help.qlik.com&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;A MySQL (or similar) database table with columns that match your editable columns.&lt;/LI&gt;
&lt;LI&gt;Setting up the database, extend your database with metadata fields:
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;: to store the user ID of the user who made a change&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt;: to store the datetime when a change was saved&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Here is an example of an empty database table for a change store with:&lt;/P&gt;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;a single PK “&lt;FONT face="courier new,courier"&gt;productId&lt;/FONT&gt;”&lt;/LI&gt;
&lt;LI&gt;editable columns are “&lt;FONT face="courier new,courier"&gt;AmountToOrder&lt;/FONT&gt;”, “&lt;FONT face="courier new,courier"&gt;Priority&lt;/FONT&gt;”, and “&lt;FONT face="courier new,courier"&gt;Note&lt;/FONT&gt;”.&lt;/LI&gt;
&lt;LI&gt;additional columns “&lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;” and “&lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt;”, which will be used to log user activity and merge separate changes into the same record&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="table example product id amounttoorder priority note userid updateat.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185565iAC59D842F9F1A3B1/image-size/large?v=v2&amp;amp;px=999" role="button" title="table example product id amounttoorder priority note userid updateat.png" alt="table example product id amounttoorder priority note userid updateat.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Creating the automation&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;Create a new automation. See&amp;nbsp;&lt;A href="https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_QlikAutomation/introduction/home-automation.htm" target="_blank" rel="noopener"&gt;Qlik Automate&lt;/A&gt;&amp;nbsp;for details.&lt;/LI&gt;
&lt;LI&gt;Add the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt; from the &lt;STRONG&gt;Qlik Cloud Services&lt;/STRONG&gt; connector.&lt;/LI&gt;
&lt;LI&gt;Configure this block with the &lt;STRONG&gt;change store ID&lt;/STRONG&gt;. You can copy this from the &lt;STRONG&gt;write table chart&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Perform a manual run of the automation to make sure some records are returned. The &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt; will return a list of objects for each cell that contains one or more changes. Every object includes the combination of primary key(s), the editable column for that cell, and a list of all values belonging to that cell.&lt;/LI&gt;
&lt;LI&gt;You have two options on how to perform this sync:
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;STRONG&gt;Insert changes one by one&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Insert changes in bulk&lt;/STRONG&gt; (this option is more complex but also more performant)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Insert changes in MySQL one by one&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Loop block&lt;/STRONG&gt;&amp;nbsp;(&lt;STRONG&gt;A&lt;/STRONG&gt;)inside the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt; and configure it to loop over the list of changes inside each object returned by the &lt;STRONG&gt;List Change Store History block&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;)&amp;nbsp;:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add loop block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185567iDEFF9792ECDAB1B8/image-size/large?v=v2&amp;amp;px=999" role="button" title="add loop block.png" alt="add loop block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="list change storey history item changes.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185568i7D0C7C2D0450817C/image-size/large?v=v2&amp;amp;px=999" role="button" title="list change storey history item changes.png" alt="list change storey history item changes.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;Search for the&lt;STRONG&gt; MySQL connector&lt;/STRONG&gt; (&lt;STRONG&gt;A&lt;/STRONG&gt;)&amp;nbsp;in the automation block library and drag the &lt;STRONG&gt;Upsert Record block&lt;/STRONG&gt; inside the &lt;STRONG&gt;Loop block &lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;) :&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="search mysql connector.png" style="width: 486px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185569i18B920E960D41205/image-dimensions/486x478?v=v2" width="486" height="478" role="button" title="search mysql connector.png" alt="search mysql connector.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add upsert record.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185570i686168EAC2A13815/image-size/large?v=v2&amp;amp;px=999" role="button" title="add upsert record.png" alt="add upsert record.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Create a new connection&lt;/STRONG&gt; (&lt;STRONG&gt;C&lt;/STRONG&gt;) to your MySQL database in the &lt;STRONG&gt;Connection&lt;/STRONG&gt; tab of the &lt;STRONG&gt;Upsert Record block&lt;/STRONG&gt; and activate it for the block by clicking it once created.&lt;/LI&gt;
&lt;LI&gt;Configure the &lt;STRONG&gt;Upsert Record&lt;/STRONG&gt; &lt;STRONG&gt;block&lt;/STRONG&gt; as follows
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;STRONG&gt;Table&lt;/STRONG&gt;: the &lt;STRONG&gt;database table&lt;/STRONG&gt; you have created for the &lt;STRONG&gt;Write Table&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Where&lt;/STRONG&gt;: the &lt;FONT face="courier new,courier"&gt;key:value&lt;/FONT&gt; mappings for the granularity on which you want to save the changes. In this example, it is a combination of the primary key (&lt;FONT face="courier new,courier"&gt;productId&lt;/FONT&gt;) with &lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt; and &lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt;.&lt;BR /&gt;&lt;BR /&gt;
&lt;OL class="lia-list-style-type-lower-alpha"&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;productId &lt;/FONT&gt;(primary key): this comes from the &lt;FONT face="courier new,courier"&gt;cellKey&lt;/FONT&gt; in the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt;.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="upsert record table setup productID.png" style="width: 634px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185585i8E92CF1993B8226A/image-dimensions/634x779?v=v2" width="634" height="779" role="button" title="upsert record table setup productID.png" alt="upsert record table setup productID.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt; and &lt;FONT face="courier new,courier"&gt;createdAt&lt;/FONT&gt;: these are defined for each change, so they should be retrieved from the item in the &lt;STRONG&gt;Loop block&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;The &lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt; maps to the &lt;FONT face="courier new,courier"&gt;createdBy&lt;/FONT&gt; parameter.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="upsert record table setup userID createdBy.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185586iCE5AABDF1D2D6181/image-size/large?v=v2&amp;amp;px=999" role="button" title="upsert record table setup userID createdBy.png" alt="upsert record table setup userID createdBy.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="upsert record table setup userID updatedAt.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185587iA8BB32191DFB751E/image-size/large?v=v2&amp;amp;px=999" role="button" title="upsert record table setup userID updatedAt.png" alt="upsert record table setup userID updatedAt.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Record&lt;/STRONG&gt;: this is the &lt;FONT face="courier new,courier"&gt;key:value&lt;/FONT&gt; mapping for the individual change that should get updated. The &lt;STRONG&gt;Key&lt;/STRONG&gt; maps to the &lt;FONT face="courier new,courier"&gt;columnName&lt;/FONT&gt; that is returned by the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt;, the &lt;STRONG&gt;Value&lt;/STRONG&gt; maps to the &lt;FONT face="courier new,courier"&gt;cellValue&lt;/FONT&gt; parameter that is returned in the &lt;STRONG&gt;Loop block&lt;/STRONG&gt;:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="upsert record table setup key value.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185588i0D7A7B83FF8B8365/image-size/large?v=v2&amp;amp;px=999" role="button" title="upsert record table setup key value.png" alt="upsert record table setup key value.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;This is what your automation will look like now:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="insert changes in mysql one by one - finished automation.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185590iA986B5C1E42BBF59/image-size/large?v=v2&amp;amp;px=999" role="button" title="insert changes in mysql one by one - finished automation.png" alt="insert changes in mysql one by one - finished automation.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Run the automation manually by clicking the Run button in the automation editor and review that you have records showing in the MySQL table:&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="insert changes in mysql one by one - finished automation records example.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185591i8B7884AC06CABB00/image-size/large?v=v2&amp;amp;px=999" role="button" title="insert changes in mysql one by one - finished automation records example.png" alt="insert changes in mysql one by one - finished automation records example.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;Making this incremental&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Currently, there is no incremental version yet for the Get Change Store History block. While this is on our roadmap, the automation from this article can be extended to do incremental loads, by first retrieving the highest updatedAt value from the MySQL table. The below steps explain how the automation can be extended:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Do Query block&lt;/STRONG&gt; from the &lt;STRONG&gt;MySQL connector&lt;/STRONG&gt; to the automation and configure the query as follows:&lt;BR /&gt;
&lt;PRE&gt;SELECT MAX(updatedAT) FROM &amp;lt;your database table&amp;gt;&lt;/PRE&gt;
&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Incremental - add Do Query Block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185592iE4DC2991BF98BA0E/image-size/large?v=v2&amp;amp;px=999" role="button" title="Incremental - add Do Query Block.png" alt="Incremental - add Do Query Block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Run a test run of the automation without the other blocks attached to verify the result in the &lt;STRONG&gt;Do Query&lt;/STRONG&gt; block’s &lt;STRONG&gt;History&lt;/STRONG&gt; tab:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Incremental - test run.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185593iE771DA0EC394792D/image-size/large?v=v2&amp;amp;px=999" role="button" title="Incremental - test run.png" alt="Incremental - test run.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Condition&lt;/STRONG&gt; &lt;STRONG&gt;block&lt;/STRONG&gt; (&lt;STRONG&gt;A&lt;/STRONG&gt;)&amp;nbsp;to the automation and configure it to evaluate the &lt;FONT face="courier new,courier"&gt;MAX(updatedAt)&lt;/FONT&gt;&amp;nbsp;(&lt;STRONG&gt;B&lt;/STRONG&gt;) field from the &lt;STRONG&gt;Do Query block&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;Because the &lt;STRONG&gt;Do Query&lt;/STRONG&gt; block returns the value as part of a list, the automation editor prompts you to specify which item of the list you want to use. Use the default version option &lt;STRONG&gt;Select first item from list&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;C&lt;/STRONG&gt;).&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Incremental - add a condition.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185594iD5BB7D9A36171956/image-size/large?v=v2&amp;amp;px=999" role="button" title="Incremental - add a condition.png" alt="Incremental - add a condition.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="select first item from list.png" style="width: 517px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185595i248CFB8A722D989E/image-dimensions/517x555?v=v2" width="517" height="555" role="button" title="select first item from list.png" alt="select first item from list.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Configure the operator in the &lt;STRONG&gt;Condition&lt;/STRONG&gt; &lt;STRONG&gt;block&lt;/STRONG&gt; to &lt;STRONG&gt;is not empty&lt;/STRONG&gt;. If an&amp;nbsp;&lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt; timestamp is found, the &lt;STRONG&gt;Yes&lt;/STRONG&gt; part of the &lt;STRONG&gt;Condition&lt;/STRONG&gt; &lt;STRONG&gt;block&lt;/STRONG&gt; will be executed. If no timestamp is found, the &lt;STRONG&gt;No&lt;/STRONG&gt; part will be executed.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="do query is not empty.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185596iE363E7C24BA549E4/image-size/large?v=v2&amp;amp;px=999" role="button" title="do query is not empty.png" alt="do query is not empty.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Variable block&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;A&lt;/STRONG&gt;)to the &lt;STRONG&gt;Yes&lt;/STRONG&gt; part of the &lt;STRONG&gt;Condition&lt;/STRONG&gt; &lt;STRONG&gt;block&lt;/STRONG&gt; and create a new variable of type &lt;STRONG&gt;String&lt;/STRONG&gt; named &lt;STRONG&gt;Filter&lt;/STRONG&gt;. The setting is accessed from the &lt;STRONG&gt;Manage variables&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;)&amp;nbsp;button in the&amp;nbsp;&lt;STRONG&gt;Variables&amp;nbsp;&lt;/STRONG&gt;block.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add variables.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185597iABD7B9A3754562EC/image-size/large?v=v2&amp;amp;px=999" role="button" title="add variables.png" alt="add variables.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="filter string.png" style="width: 627px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185598i120671E2269A93D8/image-dimensions/627x397?v=v2" width="627" height="397" role="button" title="filter string.png" alt="filter string.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Add an &lt;STRONG&gt;operation&lt;/STRONG&gt; to the &lt;STRONG&gt;Variable block&lt;/STRONG&gt; to &lt;STRONG&gt;Set value&lt;/STRONG&gt; &lt;STRONG&gt;of Filter&lt;/STRONG&gt; and type &lt;FONT face="courier new,courier"&gt;updatedAt gt “&lt;/FONT&gt; in the input field.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="operations on filter.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185599i38A73142E07CF1DE/image-size/large?v=v2&amp;amp;px=999" role="button" title="operations on filter.png" alt="operations on filter.png" /&gt;&lt;/span&gt; &lt;BR /&gt;&lt;BR /&gt;Click in the input field to add a reference to the timestamp in the &lt;STRONG&gt;Do Query block,&lt;/STRONG&gt; mirroring the &lt;STRONG&gt;Condition block&lt;/STRONG&gt;&amp;nbsp;configuration.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="output from do query.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185600iCDB3D421B2888B3A/image-size/large?v=v2&amp;amp;px=999" role="button" title="output from do query.png" alt="output from do query.png" /&gt;&lt;/span&gt; &lt;BR /&gt;&lt;BR /&gt;After the mapping is added, append it with an additional double quote character:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add double quotes.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185601iDB4A341DF6432726/image-size/large?v=v2&amp;amp;px=999" role="button" title="add double quotes.png" alt="add double quotes.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Right-click the &lt;STRONG&gt;Variable block&lt;/STRONG&gt;&amp;nbsp;and duplicate it, then add the duplicated block to the&amp;nbsp;&lt;STRONG&gt;No&lt;/STRONG&gt; part of the &lt;STRONG&gt;Condition&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;A&lt;/STRONG&gt;). &lt;BR /&gt;&lt;BR /&gt;Remove the &lt;STRONG&gt;Set value of Filter&lt;/STRONG&gt; step and replace it with the &lt;STRONG&gt;Empty Variable&lt;/STRONG&gt;&amp;nbsp;(&lt;STRONG&gt;B&lt;/STRONG&gt;) operation. &lt;BR /&gt;&lt;BR /&gt;Right-click each Variable block and add a comment explaining the respective function.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="duplicate variable block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185602i4836843B3D222057/image-size/large?v=v2&amp;amp;px=999" role="button" title="duplicate variable block.png" alt="duplicate variable block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Reattach the original automation after the &lt;STRONG&gt;Condition block.&lt;/STRONG&gt;&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Verify that it is attached after the block and not inside the &lt;EM&gt;Yes&amp;nbsp;&lt;/EM&gt;or&amp;nbsp;&lt;EM&gt;No&amp;nbsp;&lt;/EM&gt;sections.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="reattach.png" style="width: 469px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185603i12B45455AC6F3DC3/image-size/large?v=v2&amp;amp;px=999" role="button" title="reattach.png" alt="reattach.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;In the&amp;nbsp;&lt;STRONG&gt;List Change Store History block&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;A&lt;/STRONG&gt;),&amp;nbsp;map the &lt;STRONG&gt;Filter&lt;/STRONG&gt; variable to the &lt;STRONG&gt;Filter parameter&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;)&amp;nbsp;:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add filter variable in list change store history block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185604i34EEBA34425A6229/image-size/large?v=v2&amp;amp;px=999" role="button" title="add filter variable in list change store history block.png" alt="add filter variable in list change store history block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Run the automation and confirm it only picks up new changes on new runs.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Bulk updates&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;The solution documented in the previous section will execute the &lt;STRONG&gt;Upsert Record&lt;/STRONG&gt; block once for each cell with changes in the change store. This may create too much traffic for some use cases. To address this, the automation can be extended to support bulk operations and insert multiple records in a single database operation.&lt;/P&gt;
&lt;P&gt;The approach is to transform the output of the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt; from a &lt;STRONG&gt;nested list of changes&lt;/STRONG&gt; into a &lt;STRONG&gt;list of records that contains the changes grouped by primary key&lt;/STRONG&gt;, &lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;, and &lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt; timestamp.&lt;/P&gt;
&lt;P&gt;See the attached automation example:&amp;nbsp; &lt;EM&gt;Automation Example to Bulk Extract Change Store History to MySQL Incremental.json.&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Drag the &lt;STRONG&gt;Loop&lt;/STRONG&gt; and &lt;STRONG&gt;Upsert Record block&lt;/STRONG&gt; outside the &lt;STRONG&gt;List Change Store History loop&lt;/STRONG&gt;, but do not delete them:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="detach loop and upsert.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185605i9D4977CDFB48B81E/image-size/large?v=v2&amp;amp;px=999" role="button" title="detach loop and upsert.png" alt="detach loop and upsert.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Variable block&lt;/STRONG&gt; inside the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt; loop (&lt;STRONG&gt;A&lt;/STRONG&gt;) and create a new variable &lt;STRONG&gt;partialChangeRecord&lt;/STRONG&gt; of type &lt;STRONG&gt;Object&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;). &lt;BR /&gt;&lt;BR /&gt;This variable will be used to map each cell value to the primary key(s), &lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;&amp;nbsp;and &lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt; timestamp.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="variable partialchangerecord.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185606iD92EB16B18517B51/image-size/large?v=v2&amp;amp;px=999" role="button" title="variable partialchangerecord.png" alt="variable partialchangerecord.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add the first operation to the &lt;STRONG&gt;Variable&lt;/STRONG&gt; to &lt;STRONG&gt;Empty&lt;/STRONG&gt; it (&lt;STRONG&gt;A&lt;/STRONG&gt;). &lt;BR /&gt;&lt;BR /&gt;This is important to ensure that for every item in the loop, we start with&lt;STRONG&gt; an empty&lt;/STRONG&gt; &lt;STRONG&gt;partialChangeRecord&lt;/STRONG&gt; variable. &lt;BR /&gt;&lt;BR /&gt;Next, add a &lt;STRONG&gt;Set key/values&lt;/STRONG&gt; operation to set the primary key(s) (&lt;STRONG&gt;B&lt;/STRONG&gt;). &lt;BR /&gt;&lt;BR /&gt;In our example, we have a single primary key,&amp;nbsp;&lt;FONT face="courier new,courier"&gt;productId,&lt;/FONT&gt; but if you have multiple fields, you should add them one by one.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="variable partialchangerecord in empty variable and key value.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185608i77F1E804B817AAF9/image-size/large?v=v2&amp;amp;px=999" role="button" title="variable partialchangerecord in empty variable and key value.png" alt="variable partialchangerecord in empty variable and key value.png" /&gt;&lt;/span&gt; &lt;BR /&gt;&lt;BR /&gt;Set it to the &lt;STRONG&gt;cellKey.rowKey&lt;/STRONG&gt; parameter returned in the output from &lt;STRONG&gt;List Change Store History&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="variable partialchangerecord in cellkey.png" style="width: 918px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185607iA64725D5ED650DE8/image-size/large?v=v2&amp;amp;px=999" role="button" title="variable partialchangerecord in cellkey.png" alt="variable partialchangerecord in cellkey.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Drag the &lt;STRONG&gt;Loop block&lt;/STRONG&gt; back into the automation and attach it to the &lt;STRONG&gt;Variable block&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;Disconnect the &lt;STRONG&gt;Upsert Record block&lt;/STRONG&gt;.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="attach loop block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185609i3BAE24BF91331089/image-size/large?v=v2&amp;amp;px=999" role="button" title="attach loop block.png" alt="attach loop block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add a new &lt;STRONG&gt;Variable block&lt;/STRONG&gt; inside the &lt;STRONG&gt;Loop block&lt;/STRONG&gt; and configure the &lt;STRONG&gt;Variable parameter&lt;/STRONG&gt; to the &lt;STRONG&gt;partialChangeRecord&lt;/STRONG&gt; object. &lt;BR /&gt;&lt;BR /&gt;Now set additional &lt;STRONG&gt;Key/values&lt;/STRONG&gt; in the variable for the primary &lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;, &lt;FONT face="courier new,courier"&gt;updatedAt,&lt;/FONT&gt; and the &lt;FONT face="courier new,courier"&gt;cellValue&lt;/FONT&gt;:&lt;BR /&gt;&lt;BR /&gt;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;userId&lt;/FONT&gt;: &lt;FONT face="courier new,courier"&gt;createdBy&lt;/FONT&gt; parameter returned in the loop&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt;: &lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt; parameter returned in the loop&lt;/LI&gt;
&lt;LI&gt;For the &lt;FONT face="courier new,courier"&gt;Cell&lt;/FONT&gt; &lt;FONT face="courier new,courier"&gt;value&lt;/FONT&gt;, set the key to the &lt;FONT face="courier new,courier"&gt;columnName&lt;/FONT&gt; returned by the&lt;STRONG&gt; List Change Store History block&lt;/STRONG&gt; and set the &lt;STRONG&gt;Value&lt;/STRONG&gt; to the &lt;FONT face="courier new,courier"&gt;cellValue&lt;/FONT&gt; returned from the &lt;STRONG&gt;Loop block&lt;/STRONG&gt;:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="operations on partialchangerecord.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185610i10D3DE47A12D7C8B/image-size/large?v=v2&amp;amp;px=999" role="button" title="operations on partialchangerecord.png" alt="operations on partialchangerecord.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="courier new,courier"&gt;uniqueKey&lt;/FONT&gt;: add a fourth keyValue pair &lt;FONT face="courier new,courier"&gt;uniqueKey&lt;/FONT&gt;. &lt;BR /&gt;&lt;BR /&gt;This will be used later to merge various cell changes into a single record. &lt;BR /&gt;&lt;BR /&gt;This combines the primary key(s), &lt;FONT face="courier new,courier"&gt;userId,&lt;/FONT&gt; and &lt;FONT face="courier new,courier"&gt;updatedAt&lt;/FONT&gt; timestamp, each separated by a pipe (&lt;STRONG&gt;|&lt;/STRONG&gt;) symbol. &lt;BR /&gt;&lt;BR /&gt;Click the input field, map the first parameter, then type a &lt;STRONG&gt;|&lt;/STRONG&gt; &lt;STRONG&gt;-&lt;/STRONG&gt;symbol, and click the input field again to map the next parameter:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pipe symbol.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185611i7C5B69996F09812A/image-size/large?v=v2&amp;amp;px=999" role="button" title="pipe symbol.png" alt="pipe symbol.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="uniquekey.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185612iF9C4E9492185C3A3/image-size/large?v=v2&amp;amp;px=999" role="button" title="uniquekey.png" alt="uniquekey.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Add another &lt;STRONG&gt;Variable block&lt;/STRONG&gt; inside the &lt;STRONG&gt;Loop block&lt;/STRONG&gt;&amp;nbsp;(&lt;STRONG&gt;A&lt;/STRONG&gt;) and create a new list type variable&amp;nbsp;&lt;STRONG&gt;listOfPartialChanges&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;Add an &lt;STRONG&gt;Add item&lt;/STRONG&gt; operation to add the &lt;STRONG&gt;partialChangeRecord&lt;/STRONG&gt; variable (&lt;STRONG&gt;B&lt;/STRONG&gt;) to this list.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="variable listofpartialchanges.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185613i15220BFF1965749B/image-size/large?v=v2&amp;amp;px=999" role="button" title="variable listofpartialchanges.png" alt="variable listofpartialchanges.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Merge Lists block&lt;/STRONG&gt; after the &lt;STRONG&gt;List Change Store History block&lt;/STRONG&gt;.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;The &lt;STRONG&gt;Merge Lists block&lt;/STRONG&gt; will be used to merge the partial change records into full records for each change. &lt;BR /&gt;&lt;BR /&gt;Configure both &lt;STRONG&gt;List parameters&lt;/STRONG&gt; in the&lt;STRONG&gt; Merge Lists block&lt;/STRONG&gt; to use the &lt;STRONG&gt;listOfPartialChanges&lt;/STRONG&gt; variable.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="merge lists.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185614i0428F0257AE7E81F/image-size/large?v=v2&amp;amp;px=999" role="button" title="merge lists.png" alt="merge lists.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Go to the &lt;STRONG&gt;Settings&lt;/STRONG&gt; tab of the &lt;STRONG&gt;Merge Lists block&lt;/STRONG&gt; and apply this configuration:&lt;BR /&gt;&lt;BR /&gt;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;&lt;STRONG&gt;Item merge strategy&lt;/STRONG&gt;: Merge list 1 item and list 2 item in one new item (default)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;List 1 unique key&lt;/STRONG&gt;: uniqueKey&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;List 2 unique key&lt;/STRONG&gt;: uniqueKey&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;On duplicate unique key&lt;/STRONG&gt;: Merge item from list 2 into item from list 1&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;When a property exists on both lists&lt;/STRONG&gt;: Keep value from list 1 (default)&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Due to an ongoing defect, this parameter is only available after refreshing the automation editor. As the parameters use the&amp;nbsp;&lt;STRONG&gt;default&amp;nbsp;&lt;/STRONG&gt;values, this should not impact you.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="merge lists settings.png" style="width: 580px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185615i68856F52490CA2E5/image-size/large?v=v2&amp;amp;px=999" role="button" title="merge lists settings.png" alt="merge lists settings.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Perform a manual run of the automation to verify that the &lt;STRONG&gt;Merge Lists block&lt;/STRONG&gt; output is merging.&lt;BR /&gt;&lt;BR /&gt;You will notice that this list contains many duplicates.&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Deduplicate List block&lt;/STRONG&gt; (&lt;STRONG&gt;A&lt;/STRONG&gt;)&amp;nbsp;and configure the &lt;STRONG&gt;List parameter&lt;/STRONG&gt; to use the output from the &lt;STRONG&gt;Merge Lists block&lt;/STRONG&gt;, then set the key to &lt;FONT face="courier new,courier"&gt;uniqueKey &lt;/FONT&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;).&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="duplicate list.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185616i3D464057D2546D4B/image-size/large?v=v2&amp;amp;px=999" role="button" title="duplicate list.png" alt="duplicate list.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Perform another manual run and confirm that the &lt;STRONG&gt;Deduplicate List block&lt;/STRONG&gt; now only contains unique entries.&lt;/LI&gt;
&lt;LI&gt;The output still contains the &lt;FONT face="courier new,courier"&gt;uniqueKey&lt;/FONT&gt; parameter that is not compatible with the database.&lt;BR /&gt;&lt;BR /&gt;There are two options: either extend the database or remove&amp;nbsp;&lt;FONT face="courier new,courier"&gt;uniqueKey&lt;/FONT&gt;. &lt;BR /&gt;&lt;BR /&gt;To remove it, add a &lt;STRONG&gt;Transform List block&lt;/STRONG&gt; and set the &lt;STRONG&gt;Input List parameter&lt;/STRONG&gt; to the&lt;STRONG&gt; Deduplicate list block&lt;/STRONG&gt;:&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="transform list.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185618iC4BB318E78C9330A/image-size/large?v=v2&amp;amp;px=999" role="button" title="transform list.png" alt="transform list.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Configure the &lt;STRONG&gt;Fields in output&lt;/STRONG&gt; list parameter from the &lt;STRONG&gt;Transform List block&lt;/STRONG&gt;. &lt;BR /&gt;&lt;BR /&gt;To make this easier, it is best to have example data from a manual run. If you haven’t performed a manual run yet, do one now. &lt;BR /&gt;&lt;BR /&gt;Click the &lt;STRONG&gt;Add Field&lt;/STRONG&gt; button and configure new fields:&lt;BR /&gt;&lt;BR /&gt;
&lt;OL class="lia-list-style-type-lower-alpha"&gt;
&lt;LI&gt;For the &lt;STRONG&gt;Field&lt;/STRONG&gt; parameter, click the input field and start by mapping your primary keys&lt;BR /&gt;&lt;BR /&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="fields in outpust list productid.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185619i392905C5C007CBC6/image-size/large?v=v2&amp;amp;px=999" role="button" title="fields in outpust list productid.png" alt="fields in outpust list productid.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;For the &lt;STRONG&gt;Value&lt;/STRONG&gt; parameter, do the same and select the corresponding parameter in the &lt;STRONG&gt;Item in input list&lt;/STRONG&gt; option&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="product id item in input list.png" style="width: 993px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185620i2B7C3DEC5CE12305/image-size/large?v=v2&amp;amp;px=999" role="button" title="product id item in input list.png" alt="product id item in input list.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Repeat this for all other items in the list &lt;STRONG&gt;&lt;EM&gt;except&lt;/EM&gt; &lt;/STRONG&gt;for the &lt;FONT face="courier new,courier"&gt;uniqueKey&lt;/FONT&gt;&lt;BR /&gt;&lt;BR /&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="transform lists.png" style="width: 847px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185621i48560A54E1EEA12D/image-size/large?v=v2&amp;amp;px=999" role="button" title="transform lists.png" alt="transform lists.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Loop batch block&lt;/STRONG&gt;&amp;nbsp;(&lt;STRONG&gt;A&lt;/STRONG&gt;) to the automation and configure it to loop over the &lt;STRONG&gt;Transform List block output&lt;/STRONG&gt; in batches of &lt;STRONG&gt;50&amp;nbsp;&lt;/STRONG&gt;(&lt;STRONG&gt;B&lt;/STRONG&gt;). &lt;BR /&gt;&lt;BR /&gt;Adjust this batch size depending on your database and the number of editable columns.&lt;BR /&gt;&lt;BR /&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="loop batch.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185622iC9483E97ED984201/image-size/large?v=v2&amp;amp;px=999" role="button" title="loop batch.png" alt="loop batch.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Add an &lt;STRONG&gt;Insert Bulk block&lt;/STRONG&gt; from the MySQL connector within the &lt;STRONG&gt;Loop Batch block&lt;/STRONG&gt; loop. &lt;BR /&gt;&lt;BR /&gt;Configure it to use your database table variable (or hardcode your table name) and set the &lt;STRONG&gt;Values parameter&lt;/STRONG&gt; to the &lt;STRONG&gt;Batch in Loop Batch&lt;/STRONG&gt; parameter.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="insert bulk.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185623i592988EE3477D285/image-size/large?v=v2&amp;amp;px=999" role="button" title="insert bulk.png" alt="insert bulk.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Run the automation and confirm that the database gets updated.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="example output.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185624iD17622930B0A0EDA/image-size/large?v=v2&amp;amp;px=999" role="button" title="example output.png" alt="example output.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Optionally, collapse all empty loop blocks to clean up the automation and provide comments to explain what the blocks and functions do. &lt;BR /&gt;&lt;BR /&gt;This will help you understand this automation when you revisit it in the future. &lt;BR /&gt;&lt;BR /&gt;To add a comment, right-click on the block and click &lt;STRONG&gt;Edit comment&lt;/STRONG&gt;.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="commented blocks.png" style="width: 746px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185625i316C0B285FC51A0D/image-size/large?v=v2&amp;amp;px=999" role="button" title="commented blocks.png" alt="commented blocks.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Attachment configuration instructions&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;The provided automations will require additional configuration after being imported, such as changing the store, database, and primary key setup.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Automation Example to Extract Change Store History to MySQL Incremental.json&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;" value="1"&gt;&lt;SPAN&gt;Variable - databaseTable -&amp;gt; configure with the name of your database table&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Variable - changeStoreId -&amp;gt; configure with your change store ID&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Upsert Record - MySQL&amp;nbsp;-&amp;gt; replace the productId with your primary key, add additional primary keys if necessary&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Automation Example to Bulk Extract Change Store History to MySQL Incremental.json&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;" value="1"&gt;&lt;SPAN&gt;Variable - databaseTable -&amp;gt; configure with the name of your database table&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Variable - changeStoreId -&amp;gt; configure with your change store id &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Variable - partialChangeRecord -&amp;gt; replace the productId with your primary key, add additional primary keys if necessary&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Variable - partialChangeRecord in Loop block -&amp;gt; Update the uniqueKey field by replacing the productId with your primary key, add additional primary keys if necessary&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="fr" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN&gt;Transform List -&amp;gt; replace the productId with your primary key, add additional primary keys if necessary&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Bonus!&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;H4&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Replace field names&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H4&gt;
&lt;P&gt;If field names in the change store don't match the database (or another destination), the &lt;STRONG&gt;Replace Field Names In List block&lt;/STRONG&gt; can be used to translate the field names from one system to another.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Search the &lt;STRONG&gt;Replace Field Names List block&lt;/STRONG&gt; and add it to your automation.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="replace field names in list.png" style="width: 507px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185627iC816D28399390C77/image-dimensions/507x711?v=v2" width="507" height="711" role="button" title="replace field names in list.png" alt="replace field names in list.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Provide the &lt;STRONG&gt;translations&lt;/STRONG&gt;&amp;nbsp;for the field names that need to be changed to match the destination system.&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="replace field names in list inputs.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185628iADF1112A60E97978/image-size/large?v=v2&amp;amp;px=999" role="button" title="replace field names in list inputs.png" alt="replace field names in list inputs.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H4&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;User email instead of user id&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H4&gt;
&lt;P&gt;To add a more readable parameter to track the user who made changes, the&lt;STRONG&gt; Get User block&lt;/STRONG&gt; from the &lt;STRONG&gt;Qlik Cloud Services connector&lt;/STRONG&gt; can be used to map User IDs into email addresses or names.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Search the &lt;STRONG&gt;Get user block&lt;/STRONG&gt;&amp;nbsp;(&lt;STRONG&gt;A&lt;/STRONG&gt;) in the &lt;STRONG&gt;Qlik Cloud services connector&lt;/STRONG&gt; and add it to your automation. &lt;BR /&gt;&lt;BR /&gt;Configure it to use the &lt;FONT face="courier new,courier"&gt;createdBy&lt;/FONT&gt; parameter (&lt;STRONG&gt;B&lt;/STRONG&gt;).&lt;BR /&gt;&lt;BR /&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="get user block.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185629i447CD06EA967559A/image-size/large?v=v2&amp;amp;px=999" role="button" title="get user block.png" alt="get user block.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;LI&gt;Update the &lt;STRONG&gt;Upsert Record block&lt;/STRONG&gt; to use the output from &lt;STRONG&gt;Get User&lt;/STRONG&gt;.
&lt;BLOCKQUOTE class="quote"&gt;A user's name might not be sufficient as a unique identifier. Instead, combine it with a user ID or user email.&lt;/BLOCKQUOTE&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="upsert record get user.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185630iFE62021968A433D0/image-size/large?v=v2&amp;amp;px=999" role="button" title="upsert record get user.png" alt="upsert record get user.png" /&gt;&lt;/span&gt;&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H4&gt;&lt;FONT color="#339966"&gt;&lt;STRONG&gt;Triggering the automation from a sheet&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H4&gt;
&lt;P&gt;Add a &lt;STRONG&gt;button chart object&lt;/STRONG&gt; to the sheet that contains the &lt;STRONG&gt;Write Table&lt;/STRONG&gt;, allowing users to start the automation from within the Qlik app. See&amp;nbsp;&lt;A href="https://community.qlik.com/t5/Official-Support-Articles/How-to-run-an-automation-with-custom-parameters-through-the-Qlik/ta-p/2496485" target="_blank" rel="noopener"&gt;How to run an automation with custom parameters through the Qlik Sense button&lt;/A&gt;&amp;nbsp;for more information.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="add a button chart.png" style="width: 999px;"&gt;&lt;img src="https://community.qlik.com/t5/image/serverpage/image-id/185631iA9C9126CEA88AFB9/image-size/large?v=v2&amp;amp;px=999" role="button" title="add a button chart.png" alt="add a button chart.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size="5" color="#339966"&gt;Environment&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;Qlik Cloud Analytics&lt;/LI&gt;
&lt;LI&gt;Qlik Automate&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 11 Dec 2025 13:00:53 GMT</pubDate>
      <guid>https://community.qlik.com/t5/Official-Support-Articles/How-to-extract-changes-from-the-Change-Store-Write-Table-and/ta-p/2537848</guid>
      <dc:creator>Emile_Koslowski</dc:creator>
      <dc:date>2025-12-11T13:00:53Z</dc:date>
    </item>
    <item>
      <title>Re: How to extract changes from the Change Store (Write Table) and store them in a database using Qlik Automate</title>
      <link>https://community.qlik.com/t5/Official-Support-Articles/How-to-extract-changes-from-the-Change-Store-Write-Table-and/tac-p/2545397#M16962</link>
      <description>&lt;P&gt;this requires use of an API key, per the product documentation, but --- I don't see api key listed anywhere in this instruction... can you clarify this?&lt;/P&gt;</description>
      <pubDate>Tue, 24 Mar 2026 20:03:14 GMT</pubDate>
      <guid>https://community.qlik.com/t5/Official-Support-Articles/How-to-extract-changes-from-the-Change-Store-Write-Table-and/tac-p/2545397#M16962</guid>
      <dc:creator>Ken_T</dc:creator>
      <dc:date>2026-03-24T20:03:14Z</dc:date>
    </item>
    <item>
      <title>Re: How to extract changes from the Change Store (Write Table) and store them in a database using Qlik Automate</title>
      <link>https://community.qlik.com/t5/Official-Support-Articles/How-to-extract-changes-from-the-Change-Store-Write-Table-and/tac-p/2545424#M16965</link>
      <description>&lt;P&gt;Hi Ken_T, you can generate an API key through your Qlik Cloud profile settings, but this requires the Developer permission. More information is available here:&amp;nbsp;&lt;A href="https://qlik.dev/authenticate/api-key/generate-your-first-api-key/" target="_blank"&gt;https://qlik.dev/authenticate/api-key/generate-your-first-api-key/&lt;/A&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 25 Mar 2026 09:14:16 GMT</pubDate>
      <guid>https://community.qlik.com/t5/Official-Support-Articles/How-to-extract-changes-from-the-Change-Store-Write-Table-and/tac-p/2545424#M16965</guid>
      <dc:creator>Emile_Koslowski</dc:creator>
      <dc:date>2026-03-25T09:14:16Z</dc:date>
    </item>
    <item>
      <title>Re: How to extract changes from the Change Store (Write Table) and store them in a database using Qlik Automate</title>
      <link>https://community.qlik.com/t5/Official-Support-Articles/How-to-extract-changes-from-the-Change-Store-Write-Table-and/tac-p/2545477#M16973</link>
      <description>&lt;P&gt;thanks for the reply --&lt;BR /&gt;I was mentioning, no where in this write up does it mention having to get an api key and enter it anywhere in this flow...&lt;BR /&gt;&lt;BR /&gt;I have not done this in an automation yet, but in a REST connection in an app, the api key MUST be entered for it to work.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;doesn't the api key have to be entered somewhere in this automation flow for it to access the same change store info?&amp;nbsp; if so, can you add that to this doc?&amp;nbsp; or did you mention it and i missed it?&lt;/P&gt;</description>
      <pubDate>Wed, 25 Mar 2026 18:10:53 GMT</pubDate>
      <guid>https://community.qlik.com/t5/Official-Support-Articles/How-to-extract-changes-from-the-Change-Store-Write-Table-and/tac-p/2545477#M16973</guid>
      <dc:creator>Ken_T</dc:creator>
      <dc:date>2026-03-25T18:10:53Z</dc:date>
    </item>
  </channel>
</rss>

