ALTER DEFAULT PRIVILEGES je per-databáze — nové objekty mají v každé DB jiné ACL
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Migrace validovaná na hlavní scratch databázi (inicializovaný image s default privileges) dávala
jiný ACL otisk než tatáž migrace na čerstvě vytvořené databázi (CREATE DATABASE klonuje
template1 bez defaultů). Auditní tabulka navíc na „bohatší” DB tiše dostala plná práva pro
aplikační role — na append-only auditu nepřijatelné.
Root cause
Sekce “Root cause”ALTER DEFAULT PRIVILEGES se ukládá do pg_default_acl konkrétní databáze. Platformy jako
Supabase je nastavují v hlavní DB (GRANT ALL novým tabulkám/funkcím pro aplikační role);
template1 je nemá. Bonus: při ALTER TABLE ... OWNER TO nova_role PostgreSQL přepíše grantora
existujících grantů na nového vlastníka — vznikají ACL řádky, které v „chudé” DB vůbec neexistují.
Fix
Sekce “Fix”-- po CREATE TABLE/FUNCTION v migraci VŽDY:REVOKE ALL ON public.audit_tab FROM PUBLIC, app_anon, app_auth, app_service, superrole;GRANT SELECT ON public.audit_tab TO app_service; -- jen explicitní, cílené grantyJak se tomu vyvarovat v jiných systémech
Sekce “Jak se tomu vyvarovat v jiných systémech”- Detection: spustit migraci na DB s defaulty i na čisté DB a diffnout
aclexplodevýstup. - Anti-pattern: „granty doplní defaulty”; validace jen na jednom typu prostředí.
- Lepší přístup: explicitní ACL v migraci + ACL složka v pre/post manifestu migrace.