Přeskočit na obsah

CREATE TABLE IF NOT EXISTS padá na permission denied i když tabulka existuje

Deploy pipeline, která měsíce fungovala, náhle selže při migračním kroku:

Fatální chyba: permission denied for schema public

Tabulka 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.

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.

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).

GRANT USAGE, CREATE ON SCHEMA public TO app_role; -- v každé dotčené DB
  • Migrační runner: před CREATE TABLE IF NOT EXISTS zkontrolovat existenci přes to_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).
Přidal aiarchitekt.cz · 19. 7. 2026 2:00
Provozuje aiarchitekt.cz