diff --git a/tradein-mvp/backend/data/sql/102_grant_listings_gendesign_reader.sql b/tradein-mvp/backend/data/sql/102_grant_listings_gendesign_reader.sql new file mode 100644 index 00000000..111d0895 --- /dev/null +++ b/tradein-mvp/backend/data/sql/102_grant_listings_gendesign_reader.sql @@ -0,0 +1,39 @@ +-- 102_grant_listings_gendesign_reader.sql +-- Доступ gendesign_reader к market-слою tradein: unit-level квартиры-объявления (#1191). +-- +-- Контекст: Site Finder читает вторичный рынок через ETL-роль gendesign_reader. +-- Потребитель сам фильтрует канон-предикатом: +-- WHERE listing_segment IS NULL OR listing_segment = 'vtorichka' +-- Этот файл НЕ навязывает фильтр — ответственность на стороне consumer'а (#1191 контракт). +-- +-- Гранты: +-- listings — основная таблица объявлений (цена, площадь, адрес, геометрия). +-- offer_price_history — история изменений цен на квартиру (#023); нужна SF для анализа +-- динамики цены в разрезе участка (trend up/down, volatility). +-- +-- НЕ грантится: +-- listing_sources, listing_source_snapshots, listing_source_events — внутренний ETL tradein, +-- не несут дополнительной ценности для SF read-запросов поверх того, что уже есть в listings +-- + offer_price_history. +-- +-- Идемпотентно: GRANT SELECT идемпотентен; роль проверяется fail-fast DO-блоком ниже. +-- AUTO-APPLIED на прод при деплое через deploy-tradein.yml/_schema_migrations. +-- Применяется после 101_gendesign_reader_role.sql (NN гарантирует порядок). + +BEGIN; + +-- Fail-fast: роль должна существовать (м.101 идёт раньше по NN — заведомо ok). +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'gendesign_reader') THEN + RAISE EXCEPTION 'роль gendesign_reader отсутствует — сначала примените 101_gendesign_reader_role.sql'; + END IF; +END$$; + +-- unit-level объявления вторичного рынка +GRANT SELECT ON listings TO gendesign_reader; + +-- история цен на объявление (#023) — динамика цен квартир нужна SF (trend/volatility) +GRANT SELECT ON offer_price_history TO gendesign_reader; + +COMMIT;