From f2e6a59c686168437fde3b358a602566348f891b Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 29 Aug 2026 18:56:11 +0500 Subject: [PATCH] =?UTF-8?q?fix(gendesign):=20FDW-=D1=80=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D0=BC=D0=BE=D0=B3=D0=BB=D0=B0=20=D1=87=D0=B8?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D1=8C=20=D1=80=D0=B0=D0=B9=D0=BE=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=95=D0=9A=D0=91=20=E2=80=94=20=D0=B2=D0=B8=D1=82=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=20=D1=81=D0=B4=D0=B5=D0=BB=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=9C=D0=95=D0=A0=D0=AB=20=D1=82=D0=B5=D1=80=D1=8F=D0=BB=D0=B0?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B9=D0=BE=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 вместо ошибки. --- data/sql/194_grant_ekb_districts_fdw.sql | 26 ++++++++++++++++++++++++ data/sql/74_dedupe_unified_views.sql | 16 +++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 data/sql/194_grant_ekb_districts_fdw.sql diff --git a/data/sql/194_grant_ekb_districts_fdw.sql b/data/sql/194_grant_ekb_districts_fdw.sql new file mode 100644 index 00000000..a102aff3 --- /dev/null +++ b/data/sql/194_grant_ekb_districts_fdw.sql @@ -0,0 +1,26 @@ +-- 194_grant_ekb_districts_fdw.sql +-- Витрина сделок МЕРЫ не могла показать район: FDW-чтение падало с +-- permission denied for view ekb_districts_geom +-- (foreign table tradein.gendesign_ekb_districts_geom → сервер gendesign_remote, +-- роль tradein_fdw_reader). +-- +-- Причина не в потере гранта, а в том, что его не выдавали НИКОГДА. +-- 74_dedupe_unified_views.sql делает `DROP TABLE ekb_districts_geom; +-- CREATE OR REPLACE VIEW ekb_districts_geom ...` — объект сменил тип с таблицы +-- на вьюху и был создан заново, а строки GRANT рядом не появилось. Все четыре +-- соседних объекта, которые tradein читает через тот же сервер +-- (rosreestr_deals, mv_quarter_price_index, v_tradein_cad_buildings, +-- v_tradein_osm_poi_ekb), грант имеют — этот остался единственным без него. +-- +-- Тот же класс, что #2583 (188_regrant_quarter_price_index_fdw.sql): грант живёт +-- отдельно от объекта и молча исчезает при пересоздании. Поэтому GRANT дописан +-- ТАКЖЕ в конец 74-й — чтобы повторное применение той миграции его не теряло. +-- +-- Признак починки: на tradein-стороне +-- SELECT count(*) FROM gendesign_ekb_districts_geom; -- было ERROR, стало 8 + +BEGIN; + +GRANT SELECT ON public.ekb_districts_geom TO tradein_fdw_reader; + +COMMIT; diff --git a/data/sql/74_dedupe_unified_views.sql b/data/sql/74_dedupe_unified_views.sql index 1cf63d52..b601ff92 100644 --- a/data/sql/74_dedupe_unified_views.sql +++ b/data/sql/74_dedupe_unified_views.sql @@ -254,3 +254,19 @@ SELECT 'nspd', log_id, run_id, ts, level, stage, cad_number, message COMMENT ON VIEW v_scrape_log_unified IS 'Per-step log двух скраперов. entity_id = obj_id для kn / cad_number для nspd. ' 'objective scraper пока не пишет log — добавим если понадобится debug.'; + +-- ── ГРАНТ ЖИВЁТ ЗДЕСЬ, А НЕ ОТДЕЛЬНО (29.08.2026) ────────────────────────── +-- Выше `DROP TABLE ekb_districts_geom` + `CREATE OR REPLACE VIEW` меняет тип +-- объекта, то есть создаёт его заново — а вместе с объектом исчезают и его +-- гранты. Из-за этого tradein-сторона (foreign table +-- gendesign_ekb_districts_geom, роль tradein_fdw_reader) читала вьюху с +-- `permission denied` и витрина сделок МЕРЫ теряла район. +-- Тот же урок, что в 188_regrant_quarter_price_index_fdw.sql: грант, лежащий в +-- отдельной миграции, переживает ровно до следующего пересоздания объекта. +-- Держим его рядом с CREATE, чтобы объект и его права ехали вместе. +-- +-- ЧЕСТНО О ДЕЙСТВИИ: на ДЕЙСТВУЮЩЕМ проде эта строка не выполнится никогда — +-- деплой применяет только файлы, которых ещё нет в _schema_migrations, а 74-я +-- давно записана. Работу делает 194_grant_ekb_districts_fdw.sql. Здесь строка +-- нужна для чистой базы и для случая, когда файл прогоняют руками. +GRANT SELECT ON public.ekb_districts_geom TO tradein_fdw_reader; -- 2.45.3