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 .