データベース内で大量トリガーを使用することになりました。この関数は、data_changed という新しいテーブルにレコードを作成 (または更新) します。
def create_trigger_function(schema)
puts "DAVE: creating trigger function for tenant|schema #{schema.to_s}"
sql = "CREATE OR REPLACE FUNCTION \""+schema+"\".insert_into_delta_table() RETURNS TRIGGER AS 'BEGIN
UPDATE \""+schema+"\".data_changes SET status = 1, created_at = now() where table_name = TG_TABLE_NAME and record_id = NEW.id;
INSERT INTO \""+schema+"\".data_changes (status, table_name, market_id, record_id, created_at)
( select m.* from \""+schema+"\".data_changes as ds right outer join
(select 1, CAST (TG_TABLE_NAME AS text ) as name , markets.id, NEW.id as record_id, now() from \""+schema+"\".markets) as m
on
ds.record_id = m.record_id
and ds.market_id = m.id
and table_name = name
where ds.id is null );
RETURN NULL;
END;' LANGUAGE plpgsql;"
connection.execute(sql);
end
変更されたすべての「製品」を見つけるために私がしなければならないことは、
update data_changes set status = 2 where status = 1 and table_name = 'products'
select * from products where id in (select record_id from data_changes where status = 2 and table_name = 'products')
update data_changes set status = 3 where status = 2 and table_name = 'products'
最初の更新を行った後、選択を行う前に
製品が更新された場合、ID が 1 にリセットされるため、選択に表示されません。選択を行った後に製品が更新された場合、しかし、最後の更新を行う前に、最後の更新の影響を受けません。
私の選択の内容は古くなりますが、それを回避する実際の方法はありません。