#sql #postgresql #triggers #scd2
Вопрос:
Я хотел реализовать SCD2 в PostgreSQL. На данный момент я пытаюсь «создать правило», так как хотел обновить основную таблицу(например, ОСНОВНУЮ) на основе промежуточной таблицы (например, STG, которая усекается и загружается).
Поэтому всякий раз, когда есть вставка в промежуточную таблицу (STG), следующие операции должны выполняться АВТОМАТИЧЕСКИ.
- Вставьте в ОСНОВНУЮ/Основную таблицу (MAIN), если ее новая запись (присутствует в STG, но не в MAIN), установите флаг=1.
- и ниже 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 для обработки обновления вашего хранилища данных. наличие триггеров , которые должны обрабатывать миллионы вставляемых/обновляемых строк, делает базу данных практически непригодной для использования.