Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
permission denied for table - jak nadać właściwe uprawnienia
ERROR: permission denied for table przy zapytaniu do istniejącej tabeli.GRANT, a dla przyszłych tabel ustawiamy przywileje domyślne.PostgreSQL domyślnie nie udostępnia tabel każdemu, kto potrafi się zalogować - dostęp do danych trzeba nadać jawnie. Dlatego świeżo utworzona rola aplikacji często widzi bazę, ale przy pierwszym SELECT dostaje odmowę. Problem dotyczy każdego, kto rozdziela role - osobną do właściciela schematu i osobną do aplikacji. Pokazujemy, jak nadać dokładnie te przywileje, których trzeba, i jak sprawić, by obejmowały też tabele tworzone w przyszłości.
Rola aplikacji łączy się bez problemu, ale zapytanie kończy się odmową:
sklep=> SELECT * FROM zamowienia LIMIT 5;
ERROR: permission denied for table zamowieniaCo mylące, tabela istnieje i widać ją w katalogu - problemem nie jest jej brak, tylko brak przywileju. Podobnie wygląda odmowa przy zapisie, tylko z inną operacją:
sklep=> INSERT INTO zamowienia (kwota) VALUES (99);
ERROR: permission denied for table zamowieniaTo odróżnia sytuację od relation does not exist (tabeli nie ma albo jest poza search_path) - tutaj tabela jest, ale rola nie ma do niej prawa.
W PostgreSQL dostęp do danych opiera się na przywilejach nadawanych rolom. Utworzenie tabeli daje pełne prawa jej właścicielowi, ale nie innym rolom - te muszą dostać przywilej jawnie poleceniem GRANT. Przywileje są ziarniste - osobno SELECT (odczyt), INSERT (dodawanie), UPDATE (zmiana) i DELETE (usuwanie). Co ważne, GRANT działa tylko na tabele, które już istnieją w chwili jego wykonania - nowe tabele utworzone później nie odziedziczą tych przywilejów automatycznie. Dlatego typowy scenariusz to nadanie praw na bieżące tabele plus ustawienie tak zwanych przywilejów domyślnych (ALTER DEFAULT PRIVILEGES), które obejmą obiekty tworzone w przyszłości przez danego właściciela.
GRANT SELECT ON zamowienia TO app;. Dla roli zapisującej dodaj pozostałe operacje: GRANT SELECT, INSERT, UPDATE, DELETE ON zamowienia TO app;.GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app;.serial lub GENERATED ... AS IDENTITY), nadaj też prawo do nich: GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app;.ALTER DEFAULT PRIVILEGES FOR ROLE wlasciciel IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app;.app_rw) i przypisywanie do niej ludzi lub aplikacji - łatwiej wtedy zarządzać dostępem niż nadając prawa każdej roli osobno.Sprawdź nadane przywileje wprost, funkcją, która pyta serwer o efektywne prawo danej roli do tabeli:
SELECT has_table_privilege('app', 'zamowienia', 'SELECT') AS moze_czytac,
has_table_privilege('app', 'zamowienia', 'INSERT') AS moze_dodawac;Obie kolumny powinny zwrócić t. Pełną listę przywilejów obejrzysz w psql poleceniem \dp zamowienia, a najlepszym testem jest wykonanie zapytania jako rola aplikacji - powinno przejść bez odmowy.
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...