Не обязательно хранить историю, можно сравнить сами строки по хешу.
Соберем все поля строки в единый структурированный объект:
row(id, email, status, updated_at)
И посчитаем хеш от всей строки:
md5(row(... )::text)
Теперь можно сравнить два снапшота:
SELECT u_new.id
FROM users_new u_new
JOIN users_old u_old ON u_old.id = u_new.id
WHERE md5(row(u_new.*)::text) <> md5(row(u_old.*)::text);
Если нужно показать, что именно изменилось, добавьте JSON-представление строки:
row_to_json(u_new.*)
🔥 Работает на разных объёмах данных без транзакционных логов.
➡️ SQL Ready | #совет
