feat(market): revoke gendesign_reader direct SELECT on raw tables (#2138 step 3/3) #2149

Merged
lekss361 merged 1 commit from feat/market-revoke-raw-reader into main 2026-07-02 15:11:56 +00:00
Owner

Закрывает #2138 (Epic #2127), финальный шаг 3/3 трека J. Отзывает у gendesign_reader прямой SELECT на 5 сырых producer-таблиц — потребитель теперь видит ТОЛЬКО контракт market.v_*, не кухню. Гейт пройден: ETL уже читает через view (шаг 2 на проде, реальный прогон 8224 строк 0 ошибок).

Что отозвано

156_revoke_raw_from_reader.sql: REVOKE SELECT у gendesign_reader на houses, house_sources, houses_price_dynamics, house_reliability_checks, house_reviews (ровно набор из миграции 101).

Что осознанно НЕ тронуто

  • listings + offer_price_history (грант 102) — отдельный контракт Site Finder (#1191), в активном использовании
  • Гранты market.v_* (155), USAGE ON SCHEMA market, yandex_jk_enrichment — контракт цел
  • USAGE ON SCHEMA public — сам строк не открывает (гейтит SELECT)

Живая проверка (прод, откатанная транзакция, ROLLBACK)

Под SET ROLE gendesign_reader после REVOKE:

  1. SELECT count(*) FROM market.v_houses → OK, 11769 (контракт цел)
  2. ETL-join v_houses ⋈ v_house_sources → OK, 60631 (потребитель работает)
  3. SELECT 1 FROM public.housespermission denied (сырой доступ отозван — цель достигнута)
  4. ROLLBACK → прод не изменён

Idempotent, BEGIN/COMMIT, fail-fast на роль, auto-apply на деплое. Порядок безопасен: шаг 2 (ETL на view) уже на проде, миграция снимает уже неиспользуемый сырой доступ.

Закрывает #2138 (Epic #2127), **финальный шаг 3/3** трека J. Отзывает у `gendesign_reader` прямой SELECT на 5 сырых producer-таблиц — потребитель теперь видит ТОЛЬКО контракт `market.v_*`, не кухню. Гейт пройден: ETL уже читает через view (шаг 2 на проде, реальный прогон 8224 строк 0 ошибок). ## Что отозвано `156_revoke_raw_from_reader.sql`: `REVOKE SELECT` у `gendesign_reader` на `houses`, `house_sources`, `houses_price_dynamics`, `house_reliability_checks`, `house_reviews` (ровно набор из миграции 101). ## Что осознанно НЕ тронуто - `listings` + `offer_price_history` (грант 102) — отдельный контракт Site Finder (#1191), в активном использовании - Гранты `market.v_*` (155), `USAGE ON SCHEMA market`, `yandex_jk_enrichment` — контракт цел - `USAGE ON SCHEMA public` — сам строк не открывает (гейтит SELECT) ## Живая проверка (прод, откатанная транзакция, ROLLBACK) Под `SET ROLE gendesign_reader` после REVOKE: 1. `SELECT count(*) FROM market.v_houses` → OK, 11769 (контракт цел) 2. ETL-join `v_houses ⋈ v_house_sources` → OK, 60631 (потребитель работает) 3. `SELECT 1 FROM public.houses` → **permission denied** (сырой доступ отозван — цель достигнута) 4. ROLLBACK → прод не изменён Idempotent, BEGIN/COMMIT, fail-fast на роль, auto-apply на деплое. Порядок безопасен: шаг 2 (ETL на view) уже на проде, миграция снимает уже неиспользуемый сырой доступ.
lekss361 added 1 commit 2026-07-02 15:11:49 +00:00
feat(market): revoke gendesign_reader direct SELECT on raw tables (#2138 step 3/3)
All checks were successful
CI / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
69bd5b96b4
lekss361 merged commit abef3e6e02 into main 2026-07-02 15:11:56 +00:00
lekss361 deleted branch feat/market-revoke-raw-reader 2026-07-02 15:11:56 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2149
No description provided.