fix(gendesign): FDW-роль не могла читать районы ЕКБ — витрина сделок МЕРЫ теряла район #3227

Merged
bot-backend merged 1 commit from fix/ekb-districts-fdw-grant into main 2026-08-29 14:15:47 +00:00
Collaborator

Найдено при подготовке витрины реальных сделок для лэндинга МЕРЫ.

Симптом

На tradein-стороне любой запрос к foreign table gendesign_ekb_districts_geom падает:

ERROR:  permission denied for view ekb_districts_geom
CONTEXT:  remote SQL command: EXPLAIN SELECT NULL FROM public.ekb_districts_geom

То есть район у сделки не резолвится, и лента на лэндинге показывала бы «2-к, 54 м², 5 эт.» без района.

Диагноз (замер, а не догадка)

SELECT has_table_privilege('tradein_fdw_reader','public.ekb_districts_geom','SELECT');
-- f

При этом все четыре соседних объекта того же FDW-сервера gendesign_remote грант имеют:

объект acl
rosreestr_deals tradein_fdw_reader=r/gendesign
mv_quarter_price_index tradein_fdw_reader=r/gendesign
v_tradein_cad_buildings tradein_fdw_reader=r/gendesign
v_tradein_osm_poi_ekb tradein_fdw_reader=r/gendesign
ekb_districts_geom пусто

Правильный образец лежал в двух шагах от дефекта.

Грант не «потерялся» — его не выдавали никогда. 74_dedupe_unified_views.sql делает DROP TABLE ekb_districts_geom; + CREATE OR REPLACE VIEW ekb_districts_geom AS ..., то есть меняет тип объекта и создаёт его заново, а строки GRANT рядом не было. Объект на проде сейчас relkind='v', хотя 56_schema_ekb_districts_geom.sql заводил таблицу.

Тот же класс, что #2583 (188_regrant_quarter_price_index_fdw.sql): право живёт отдельно от объекта и исчезает при пересоздании молча — FDW отвечает ошибкой доступа, а не отсутствием данных, поэтому симптом читается как «сломался запрос», а не «нет прав».

Что в PR

  1. 194_grant_ekb_districts_fdw.sql — сам грант. Идемпотентен.
  2. GRANT дописан в конец 74_dedupe_unified_views.sql, рядом с CREATE, чтобы объект и его права ехали вместе.

Честно про п.2: на действующем проде эта строка не выполнится никогда — деплой применяет только файлы, которых ещё нет в _schema_migrations, а 74-я давно записана. Всю работу делает 194-я. Строка в 74-й нужна для чистой базы и для ручного прогона файла. Это прямо написано в комментарии, чтобы следующий читатель не решил, что фикс двойной.

Приёмка на проде (числом, после деплоя)

-- в базе gendesign:
SELECT has_table_privilege('tradein_fdw_reader','public.ekb_districts_geom','SELECT');  -- ожидается t
-- в базе tradein (сейчас отдаёт ERROR):
SELECT count(*) FROM gendesign_ekb_districts_geom;  -- ожидается 8
Найдено при подготовке витрины реальных сделок для лэндинга МЕРЫ. ## Симптом На tradein-стороне любой запрос к foreign table `gendesign_ekb_districts_geom` падает: ``` ERROR: permission denied for view ekb_districts_geom CONTEXT: remote SQL command: EXPLAIN SELECT NULL FROM public.ekb_districts_geom ``` То есть район у сделки не резолвится, и лента на лэндинге показывала бы «2-к, 54 м², 5 эт.» без района. ## Диагноз (замер, а не догадка) ```sql SELECT has_table_privilege('tradein_fdw_reader','public.ekb_districts_geom','SELECT'); -- f ``` При этом **все четыре** соседних объекта того же FDW-сервера `gendesign_remote` грант имеют: | объект | acl | |---|---| | `rosreestr_deals` | `tradein_fdw_reader=r/gendesign` | | `mv_quarter_price_index` | `tradein_fdw_reader=r/gendesign` | | `v_tradein_cad_buildings` | `tradein_fdw_reader=r/gendesign` | | `v_tradein_osm_poi_ekb` | `tradein_fdw_reader=r/gendesign` | | **`ekb_districts_geom`** | **пусто** | Правильный образец лежал в двух шагах от дефекта. Грант не «потерялся» — его **не выдавали никогда**. `74_dedupe_unified_views.sql` делает `DROP TABLE ekb_districts_geom;` + `CREATE OR REPLACE VIEW ekb_districts_geom AS ...`, то есть меняет тип объекта и создаёт его заново, а строки `GRANT` рядом не было. Объект на проде сейчас `relkind='v'`, хотя `56_schema_ekb_districts_geom.sql` заводил таблицу. Тот же класс, что #2583 (`188_regrant_quarter_price_index_fdw.sql`): право живёт отдельно от объекта и исчезает при пересоздании молча — FDW отвечает ошибкой доступа, а не отсутствием данных, поэтому симптом читается как «сломался запрос», а не «нет прав». ## Что в PR 1. `194_grant_ekb_districts_fdw.sql` — сам грант. Идемпотентен. 2. `GRANT` дописан в конец `74_dedupe_unified_views.sql`, рядом с `CREATE`, чтобы объект и его права ехали вместе. **Честно про п.2:** на действующем проде эта строка не выполнится никогда — деплой применяет только файлы, которых ещё нет в `_schema_migrations`, а 74-я давно записана. Всю работу делает 194-я. Строка в 74-й нужна для чистой базы и для ручного прогона файла. Это прямо написано в комментарии, чтобы следующий читатель не решил, что фикс двойной. ## Приёмка на проде (числом, после деплоя) ```sql -- в базе gendesign: SELECT has_table_privilege('tradein_fdw_reader','public.ekb_districts_geom','SELECT'); -- ожидается t ``` ```sql -- в базе tradein (сейчас отдаёт ERROR): SELECT count(*) FROM gendesign_ekb_districts_geom; -- ожидается 8 ```
bot-backend added 1 commit 2026-08-29 13:56:40 +00:00
fix(gendesign): FDW-роль не могла читать районы ЕКБ — витрина сделок МЕРЫ теряла район
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m5s
CI / backend-tests (pull_request) Successful in 17m46s
f2e6a59c68
foreign table tradein.gendesign_ekb_districts_geom падала с «permission denied for
view ekb_districts_geom». Замер: has_table_privilege('tradein_fdw_reader',
'public.ekb_districts_geom','SELECT') = false, при том что все четыре соседних
объекта того же FDW-сервера (rosreestr_deals, mv_quarter_price_index,
v_tradein_cad_buildings, v_tradein_osm_poi_ekb) грант имеют.

Грант не «потерялся» — его не выдавали никогда: 74_dedupe_unified_views.sql
меняет тип объекта (DROP TABLE + CREATE OR REPLACE VIEW), то есть создаёт его
заново, а строки GRANT рядом не было. Тот же класс, что #2583.

Приёмка на проде после деплоя: тот же has_table_privilege обязан вернуть true,
а SELECT count(*) FROM gendesign_ekb_districts_geom — 8 вместо ошибки.
bot-backend merged commit 2eb7814c36 into main 2026-08-29 14:15:47 +00:00
bot-backend deleted branch fix/ekb-districts-fdw-grant 2026-08-29 14:15:47 +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#3227
No description provided.