Po pierwsze, musisz być w stanie połączyć się z bazą danych, aby uruchomić zapytania. Można to osiągnąć przez
REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;
GRANT CONNECT
ON DATABASE database_name
TO user_name;
Jest REVOKE
to konieczne, ponieważ
Słowo kluczowe PUBLIC wskazuje, że uprawnienia należy przyznać wszystkim rolom, w tym także tym, które mogą zostać utworzone później. PUBLIC można traktować jako domyślnie zdefiniowaną grupę, która zawsze obejmuje wszystkie role. Każda konkretna rola będzie miała sumę przywilejów przyznanych bezpośrednio jej, przywilejów przyznanych każdej roli, której jest obecnie członkiem, oraz przywilejów przyznanych PUBLIC.
Jeśli naprawdę chcesz ograniczyć użytkownika do instrukcji DML, musisz zrobić coś więcej:
REVOKE ALL
ON ALL TABLES IN SCHEMA public
FROM PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public
TO user_name;
Zakładają one, że będziesz mieć tylko jeden schemat (domyślnie nazywany „publicznym”).
Jak zauważył Jack Douglas, powyższe daje uprawnienia tylko dla już istniejących tabel. Aby osiągnąć to samo w przyszłych tabelach, musisz zdefiniować domyślne uprawnienia :
ALTER DEFAULT PRIVILEGES
FOR ROLE some_role -- Alternatively "FOR USER"
IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;
Tutaj some_role
jest rola, która tworzy tabele, podczas gdy user_name
to ta, która otrzymuje uprawnienia. Aby to zdefiniować, musisz być zalogowany jako some_role
członek lub członek.
I w końcu musisz zrobić to samo dla sekwencji (dzięki PlaidFan za wskazanie tego) - tutaj jest USAGE
przywilej, którego potrzebujesz.
FOR some_role
był kluczowy element, którego mi brakowało, aby działał w moich tabelach utworzonych później. Ale nie musiałem się logowaćsome_role
, ponieważ działało to również, jeśli wykonałem zapytanie jako domyślnypostgres
użytkownik administracyjny .zakładając, że chcesz dać im wszystkie uprawnienia - zrób to:
gdzie
dbname
jest nazwą twojej bazy danych idbuser
jest nazwą użytkownika.źródło
CREATE, CONNECT, TEMPORARY
. Brak uprawnień do tabel.GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Przyznanie wszystkich uprawnień do wszystkich tabel w bazie danych jest osiągane za pomocą
źródło
Możliwe, że robiłem tutaj coś złego, ponieważ jestem bardzo nowy w PostgreSQL. Ale to tylko rozwiązało dla mnie pierwszą część problemu - ustawienie uprawnień na wszystkich istniejących tabelach.
Aby uprawnienia były poprawnie ustawione dla mojego użytkownika na nowe tabele, które są tworzone, muszę ustawić domyślne uprawnienia dla użytkownika:
źródło
źródło