Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
permission denied for schema public - zmiany w PostgreSQL 15
ERROR: permission denied for schema public przy tworzeniu tabeli.public nie daje już domyślnie prawa CREATE wszystkim rolom - to celowa zmiana bezpieczeństwa.GRANT albo zakładamy dedykowany schemat dla aplikacji.To jeden z najczęstszych problemów po aktualizacji do PostgreSQL 15 lub nowszego. Kod, który latami działał, nagle nie może utworzyć tabeli w schemacie public. Powód nie jest błędem - twórcy PostgreSQL świadomie zaostrzyli domyślne uprawnienia schematu public, aby ograniczyć ryzyko nadużyć we współdzielonej bazie. Problem dotyczy każdego, kto migruje bazę albo zakłada nową na świeżej wersji. Pokazujemy, co dokładnie się zmieniło i jak przywrócić działanie w kontrolowany sposób.
Zwykła rola łączy się z bazą, ale nie może nic w niej utworzyć:
sklep=> CREATE TABLE test (id int);
ERROR: permission denied for schema public
LINE 1: CREATE TABLE test (id int);
^Ta sama komenda działała bez zarzutu na PostgreSQL 14 i starszych. Bywa też, że migracja aplikacji (na przykład narzędzie tworzące tabele przy starcie) przewraca się z tym właśnie komunikatem zaraz po podniesieniu wersji serwera.
Do PostgreSQL 14 schemat public miał nadane prawo CREATE dla specjalnej roli PUBLIC, czyli praktycznie dla każdej roli w bazie. Oznaczało to, że dowolny użytkownik mógł tworzyć obiekty w public - wygodne, ale ryzykowne we współdzielonych bazach. Od wersji 15 to prawo zostało odebrane - schemat public nadal istnieje, ale nie pozwala już domyślnie tworzyć w nim obiektów rolom innym niż właściciel. Dodatkowo właścicielem public jest teraz rola pg_database_owner, czyli właściciel danej bazy. W efekcie rola aplikacji, która wcześniej bez pytania tworzyła tabele, po migracji dostaje odmowę na poziomie schematu, jeszcze zanim dojdzie do samej tabeli.
public: GRANT CREATE, USAGE ON SCHEMA public TO app;.CREATE SCHEMA sklep_app AUTHORIZATION app;.search_path, aby domyślnie trafiała do właściwego schematu: ALTER ROLE app SET search_path = sklep_app, public;.GRANT CREATE ON SCHEMA public TO PUBLIC; - używaj tego ostrożnie.GRANT ... ON ALL TABLES ...).Sprawdź efektywne prawa roli do schematu wprost - obie kolumny powinny zwrócić t:
SELECT has_schema_privilege('app', 'public', 'CREATE') AS moze_tworzyc,
has_schema_privilege('app', 'public', 'USAGE') AS moze_uzywac;Najlepszym testem jest jednak utworzenie tabeli jako rola aplikacji - jeśli CREATE TABLE przejdzie bez odmowy, problem jest rozwiązany. Listę praw schematów obejrzysz też w psql poleceniem \dn+.
Wróć do listy: 100 najczęstszych pytań i problemów z PostgreSQL

Sprawdź szkolenie: Administracja, replikacja i tuning baz danych PostgreSQL
To szkolenie może być dofinansowane z KFS lub BUR.
★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Sprawdź szkolenie: Zaawansowana administracja PostgreSQL (HA, DR, monitoring, skalowanie)
To szkolenie może być dofinansowane z KFS lub BUR.
★★★★★Średnia ocena naszych szkoleń w Google: 5/5
Komentarze (0)
Brak komentarzy...