Реализация SCD2 в PostgreSQL с помощью «создать правило/триггер»

#sql #postgresql #triggers #scd2

Вопрос:

Я хотел реализовать SCD2 в PostgreSQL. На данный момент я пытаюсь «создать правило», так как хотел обновить основную таблицу(например, ОСНОВНУЮ) на основе промежуточной таблицы (например, STG, которая усекается и загружается).

Поэтому всякий раз, когда есть вставка в промежуточную таблицу (STG), следующие операции должны выполняться АВТОМАТИЧЕСКИ.

  1. Вставьте в ОСНОВНУЮ/Основную таблицу (MAIN), если ее новая запись (присутствует в STG, но не в MAIN), установите флаг=1.
  2. и ниже 2 sqls i. Обновите неключевые записи основной таблицы (MAIN), если она уже присутствует в таблице этапов (STG), и установите активный флаг =1. ii. Пометить старую запись как неактивную можно с флагом, установленным в 0 в ОСНОВНОЙ таблице.

Я пытаюсь что — то сделать ниже, но это не работает. Пожалуйста, предложите лучший подход/правильные SQLs. Это может быть с правилом/триггером.

 --SQL to UPDATE record in MAIN table as active record with flag=1.

create rule r_upd as on insert to STG 
where (exists (select 1 from STG where STG.id=NEW.id))
do 
     update MAIN set flag=1 where id=NEW.id;
--
There is one more rule (or can be done in one SQL) required which can set old record to inactive (FLAG=0) 
--
    
-- 
--SQL to INSERT recrord in MAIN table as active record with flag=1
create rule r_ins as on insert to STG 
do 
     insert into MAIN 
     select id, 1 from STG where id not in (select id from MAIN);
 

Спасибо.

Комментарии:

1. лучший подход-иметь процесс ETL для обработки обновления вашего хранилища данных. наличие триггеров , которые должны обрабатывать миллионы вставляемых/обновляемых строк, делает базу данных практически непригодной для использования.