From d4b1e03e1c3fca8a88bc4cfdeb813185ee78c7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Sat, 23 May 2026 20:25:11 +0300 Subject: [PATCH] chore(db): document partition-maintenance privilege model in 02_grants.sql MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sync deployment-скрипта с прод-DB-состоянием после 23.05.2026 partition fix: ALTER TABLE OWNER → crm_migrator на 7 audit-таблицах (выравнивает дрейф; prod уже в этом состоянии) + GRANT crm_migrator TO crm_supplier_worker WITH INHERIT TRUE — даёт maintenance-роли права создавать/дропать партиции через MonthlyPartitionManager::DDL_CONNECTION = pgsql_supplier (commit fd660da4). Web-роль crm_app_user остаётся least-privilege — членства не получает. Идемпотентно: повторный запуск 02_grants.sql безопасен. Связано: fd660da4 (код-фикс). Co-Authored-By: Claude Opus 4.7 --- db/02_grants.sql | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/db/02_grants.sql b/db/02_grants.sql index 2519946a..a963e70e 100644 --- a/db/02_grants.sql +++ b/db/02_grants.sql @@ -140,3 +140,34 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE ON TABLE supplier_csv_reconcile_log TO crm_supplier_worker; GRANT USAGE, SELECT ON SEQUENCE supplier_csv_reconcile_log_id_seq TO crm_supplier_worker; + +-- ============================================================================= +-- 23.05.2026 (post hole #2): partition-maintenance privilege model +-- ============================================================================= +-- `partitions:create-months` / `partitions:drop-expired` теперь идут через +-- `pgsql_supplier` connection (MonthlyPartitionManager::DDL_CONNECTION). Чтобы +-- `crm_supplier_worker` мог CREATE/DROP партиции партиционированных родителей, +-- нужны два условия: +-- 1. Единый владелец всех 9 партиционированных родителей — `crm_migrator`. +-- По умолчанию `schema.sql` создаёт audit-таблицы под `postgres` (load +-- выполняется суперпользователем при `migrate:fresh`); явный ALTER OWNER +-- ниже выравнивает прод (где это уже сделано вживую 23.05.2026) и +-- гарантирует, что fresh-deploy не разойдётся. +-- 2. `crm_supplier_worker` — член `crm_migrator` (INHERIT TRUE), чтобы +-- ownership-операции (CREATE TABLE ... PARTITION OF, DROP TABLE) проходили +-- проверку владельца. Web-роль `crm_app_user` остаётся least-privilege — +-- она НЕ получает crm_migrator-членство и НЕ может делать partition DDL. +-- +-- Идемпотентно — повторный запуск 02_grants.sql после первого применения +-- безопасен. +-- ============================================================================= + +ALTER TABLE auth_log OWNER TO crm_migrator; +ALTER TABLE activity_log OWNER TO crm_migrator; +ALTER TABLE tenant_operations_log OWNER TO crm_migrator; +ALTER TABLE webhook_log OWNER TO crm_migrator; +ALTER TABLE balance_transactions OWNER TO crm_migrator; +ALTER TABLE pd_processing_log OWNER TO crm_migrator; +ALTER TABLE saas_admin_audit_log OWNER TO crm_migrator; + +GRANT crm_migrator TO crm_supplier_worker WITH INHERIT TRUE;