CREATE TABLE IF NOT EXISTS padá na permission denied i když tabulka existuje
Symptom
Sekce “Symptom”Deploy pipeline, která měsíce fungovala, náhle selže při migračním kroku:
Fatální chyba: permission denied for schema publicTabulka přitom existuje a SELECT z ní funguje. Chyba nastává na
CREATE TABLE IF NOT EXISTS "_prisma_migrations" (...) — PostgreSQL vyhodnocuje
CREATE oprávnění na schema dřív, než zkontroluje existenci tabulky.
Příčina
Sekce “Příčina”Aplikační role přišla o CREATE právo na schema public — typicky vedlejším
efektem údržby: přestavění testovací databáze, změna vlastníka DB, restore ze
zálohy pod jiným vlastníkem, nebo PG15+ default (public schema bez CREATE pro
PUBLIC). Migrační runner pak spadne na první DDL větě, i „neškodné” IF NOT EXISTS.
Diagnóza
Sekce “Diagnóza”SELECT has_schema_privilege('app_role','public','CREATE');SELECT datdba::regrole FROM pg_database WHERE datname = current_database();f u první query = tohle. Zkontrolujte VŠECHNY databáze aplikace — právo se
typicky ztratí na více z nich najednou (společná příčina).
Oprava
Sekce “Oprava”GRANT USAGE, CREATE ON SCHEMA public TO app_role; -- v každé dotčené DBPrevence
Sekce “Prevence”- Migrační runner: před
CREATE TABLE IF NOT EXISTSzkontrolovat existenci přesto_regclass()a DDL přeskočit — snižuje závislost na CREATE právu v runtime. - Po jakékoli údržbě DB (restore, přestavba test DB, změna vlastníka) spustit privilege smoke-check přes všechny databáze aplikace.
- Deploy gate: migrace selže → swap neproběhne (auto-rollback design zafungoval, produkce zůstala na starém buildu).