This use case is applicable when Level 3 change tracking is in effect. Every UPDATE action tracks the data Before the UPDATE, and After the Update. This tracking happens both Before and After produce Change table data rows. The ETL application uses Before and After data to aggregate change values to be propagated to the Data Warehouse.
Step 1 fetches the source table number for efficient access to the Change Tracking table. It verifies whether Change tracking is active for source table by checking for an active CDC table Policy for the source table.
select f."_File-Number"
from pub.”_File” f
inner join
pub."_CDC-Table-Policy" tp
on f.rowid = tp.”_Source-File-Recid”
and tp."_Policy-Instance" = 0 -- Policy is current.
where f."_file-name" = ‘customer’
and f."_Owner" = ‘pub’ ;
Note: This step can be skipped if the source table number has been already obtained by the application numerous times.
Step 2 aggregates the updated numeric information for eventual transmission to the Data Warehouse.
select sum( case c."_Operation" when 3 then -c.Quantity
when 4 then +c.Quantity else null end)
as c_difference, -- Quantity - assumed Source table column.
min(c.itemnum) -- assumed Source table column.
from pub."_Cdc-Change-Tracking" ct
inner join
pub.CDC_Customer c -- well-known Change table name.
on ct."_Change-Sequence" = c."_Change-Sequence"
where ct."_Source-Table-Number" = ? -- from 1st query.
group by ct."_Source-Table-Number", ct."_Change-Sequence"
order by ct."_Source-Table-Number", ct."_Change-Sequence";
-- Group By, Order By keys map to index _Sequence-Id
Note: In the Change table, a given change sequence value has at most 2 Change table rows (before and after the Update).
In this use case, the ETL application would save Change values from this query. The query produces one row for each of the UPDATE, DELETE, and INSERT operations by design of the Group By clause.
For example, if the Data Warehouse contains a table Item_Chg that tracks fluctuations in inventories from the Item table in the source database, the high-level logic of the application may look like this:
Execute query #2
for each Result Set row R:
Let tmp_cdiff := R.c_difference
Let tmp_itmn := R.c_itemnum
Execute sql update to Data Warehouse:
UPDATE Item_Chg
SET ic_diff = ? -- parameter from tmp_cdiff
ic_item = ? -- parameter from tmp_itmn
WHERE ……
end for