/
Action: timeline

Action: timeline

Muudatuste tuvastamine andmelao tabelis võrreldes eelmise kontrolliga

Alias: history



On kasutusel ka selline loogika, et alates teisest laadimisest võrreldakse andmeid eelmise lõppseisuga ja tuvastatakse muudatused (kirje lisamine, kirje kustutamine, kirje andmete muutmine).

See on abimehhanism, kui alliktabel ei võimalda muudatuste tuvastamist kirje tasemel.

Selleks on vaja kohalikku hetkeseisu tabelit, kus on kõik vajalikud andmeveerud ja 2 abiveergu räside hoidmiseks. Tabel võib olla loodud versioneerimisega või ka "map"/"shadow" lahenduse abil nullist (create table as select), kus tuleb seserveerida 2 veergu NULL väärtustega:



räsiveerud
-- räsid , null::varchar(130) as dwh_hash_pk , null::varchar(130) as dwh_hash_data

Seisutabelis peab olema indeks esimese räsiveeru jaoks ja update käsk ("map" korral sealsamas create.sql failis)

create.sql või after.sql
UPDATE {{target_schema}}.{{target_table}} SET dwh_hash_pk = encode(digest(row(isik_id)::text, 'sha1'), 'hex') -- pk list , dwh_hash_data = encode(digest(row(isik_staatus_id, kirje_staatus_id, surmaaeg_kp, rahvus_id)::text, 'sha1'), 'hex') -- mitte-pk list ; CREATE INDEX ix_{{target_table}}_4_dwh_hash_pk ON {{target_schema}}.{{target_table}} (dwh_hash_pk);



Tulemtabeli definitsioon on keerulisem. See tuleb luua versioneerimisega (sest seda ei tohi tühjaks teha).

Ajajoone-tabel
CREATE TABLE {{target_schema}}.{{target_table}} ( -- võtmeväljad id integer -- andmeväljad , midagi integer , midgi_muud text , mingiaeg_kp date -- räsid , dwh_hash_pk varchar(130) , dwh_hash_data varchar(130) -- laadimise abiväljad , dwh_effective_current boolean not null default true , dwh_effective_from timestamptz not null default current_timestamp , dwh_reason_start char(1) , dwh_worker_start integer , dwh_effective_to timestamptz , dwh_reason_end char(1) , dwh_worker_end integer ); comment on table {{target_schema}}.{{target_table}} is ' Isiku andmete (isikustamata) ajajoon'; COMMENT ON COLUMN {{target_schema}}.{{target_table}}.dwh_effective_current IS 'kas hetkel kehtiv'; COMMENT ON COLUMN {{target_schema}}.{{target_table}}.dwh_worker_start IS 'mis laadimine tekitas (vt bis.bis_worker)'; COMMENT ON COLUMN {{target_schema}}.{{target_table}}.dwh_reason_start IS 'miks tekitati: I (uus algkirje) või U (algkirjet muudeti)'; COMMENT ON COLUMN {{target_schema}}.{{target_table}}.dwh_effective_from IS 'mis ajast kehtib (TS)'; COMMENT ON COLUMN {{target_schema}}.{{target_table}}.dwh_effective_to IS 'mis ajani kehtib (null kui current)'; COMMENT ON COLUMN {{target_schema}}.{{target_table}}.dwh_reason_end IS 'miks lõppes: D (algkirje kustutati) või U (algkirje muudeti)'; COMMENT ON COLUMN {{target_schema}}.{{target_table}}.dwh_worker_end IS 'mis laadimine tühistas (vt bis.bis_worker)'; CREATE INDEX ix_{{target_table}}_4_current_key ON {{target_schema}}.{{target_table}} (dwh_hash_pk) WHERE dwh_effective_current;

Definitsioon aktsioonile timeline peab viitama sellele seisutabelile (imp: ...), ja loetlema ära võtmeväljad (key_columns) ja muud väljad (data_columns)



Definitsioon
- do: timeline imp: dwh.fact_alustabel # sellel tabelil peavad olema veerud dwh_hash_pk ja dwh_hash_data (mis on välja arvutatud create table as järel, nt create.sql-is või after.sql-is) key_columns: - id data_columns: - midagi - midgi_muud - mingiaeg_kp

Kui tingimused on täidetud, siis laadimine võrdleb tulemtabeli (history-tabel, timeline-tabel) kehtivaid kirjeid seisutabeliga. Kui kirjet enam pole, siis tulemtabelis märgitakse ta lõppenud (laadimise alguse hetke ajaga): dwh_effective_to, dwh_effective_current = false, dwh_reason_end = 'D'. Kui kirje oli (PK abil tuvastati), aga muutus, siis markeeritakse samuti lõppenuks, aga dwh_reason_end = 'U' ja lisaks luuakse uus kirje, mille dwh_reason_start = 'U' (erinevalt 'I' kirjetest).

Related content