feat(market): revoke gendesign_reader direct SELECT on raw tables (#2138 step 3/3) #2149
1 changed files with 51 additions and 0 deletions
51
tradein-mvp/backend/data/sql/156_revoke_raw_from_reader.sql
Normal file
51
tradein-mvp/backend/data/sql/156_revoke_raw_from_reader.sql
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
-- 156_revoke_raw_from_reader.sql
|
||||||
|
-- Revoke gendesign_reader direct SELECT on the 5 raw producer tables (#2138, step 3/3 — FINAL).
|
||||||
|
--
|
||||||
|
-- Context / gate:
|
||||||
|
-- #2138 moves the external cross-load ETL consumer (#976 newbuilding_crossload.py) off the
|
||||||
|
-- raw producer tables and onto the stable market.v_* contract views:
|
||||||
|
-- step 1/3 (155) — GRANT SELECT on market.v_* to gendesign_reader (additive).
|
||||||
|
-- step 2/3 (merged + run on prod: 8224 rows, 0 errors) — ETL now reads
|
||||||
|
-- market.v_houses + market.v_house_sources via the views, no raw reads left.
|
||||||
|
-- step 3/3 (this file) — REVOKE the raw-table SELECT grants from 101, so the reader
|
||||||
|
-- sees ONLY the contract, not the kitchen.
|
||||||
|
--
|
||||||
|
-- Raw grants being revoked were issued by 101_gendesign_reader_role.sql:
|
||||||
|
-- houses, house_sources, houses_price_dynamics, house_reliability_checks, house_reviews.
|
||||||
|
--
|
||||||
|
-- Scope (INTENTIONALLY narrow):
|
||||||
|
-- - REVOKE only the 5 raw producer tables above.
|
||||||
|
-- - listings + offer_price_history (granted by 102 for Site Finder #1191) are NOT touched —
|
||||||
|
-- they are a separate consumer contract, still in active use.
|
||||||
|
-- - market.v_* grants (155), schema market USAGE, yandex_jk_enrichment — NOT touched.
|
||||||
|
-- - USAGE ON SCHEMA public is kept: reader still needs it and it does not expose table data
|
||||||
|
-- on its own (market lives in a separate schema; SELECT is what gates the raw rows).
|
||||||
|
--
|
||||||
|
-- Dependencies:
|
||||||
|
-- - 101_gendesign_reader_role.sql (grants being revoked)
|
||||||
|
-- - 155_reader_grants_to_contract_views.sql (view grants the reader now relies on)
|
||||||
|
--
|
||||||
|
-- Idempotent: REVOKE is repeatable — re-running when the grant is already gone is a no-op,
|
||||||
|
-- never an error. Role existence checked fail-fast below for a clear message.
|
||||||
|
-- AUTO-APPLIED on prod via deploy-tradein.yml/_schema_migrations (strict).
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
|
||||||
|
-- Fail-fast: role must exist (101 runs earlier by NN — guaranteed 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$$;
|
||||||
|
|
||||||
|
-- Reader now reads exclusively via market.v_* contract views — drop raw-table access.
|
||||||
|
REVOKE SELECT ON
|
||||||
|
houses,
|
||||||
|
house_sources,
|
||||||
|
houses_price_dynamics,
|
||||||
|
house_reliability_checks,
|
||||||
|
house_reviews
|
||||||
|
FROM gendesign_reader;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
Loading…
Add table
Reference in a new issue