Przyznaj użycie / wybierz do pojedynczego stołu
Jeśli przyznasz CONNECT tylko bazie danych, użytkownik może się połączyć, ale nie ma innych uprawnień. Musisz przyznać USAGE w przestrzeniach nazw (schematach) i SELECT w tabelach i widokach indywidualnie tak:
GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
Wiele tabel / widoków (PostgreSQL 9.0+)
W najnowszych wersjach PostgreSQL możesz udzielać uprawnień do wszystkich tabel / widoków / etc w schemacie za pomocą pojedynczego polecenia zamiast wpisywać je jeden po drugim:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
Wpływa to tylko na tabele, które zostały już utworzone. Co więcej, w przyszłości możesz automatycznie przypisywać domyślne role do nowych obiektów :
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
Zauważ, że domyślnie będzie to miało wpływ tylko na obiekty (tabele) utworzone przez użytkownika, który wydał to polecenie: chociaż można je również ustawić na dowolnej roli, do której należy użytkownik wydający. Jednak nie odbierasz domyślnych uprawnień do wszystkich ról, do których należysz podczas tworzenia nowych obiektów ... więc wciąż jest trochę kłopotów. Jeśli przyjmiesz podejście, że baza danych pełni rolę właściciela, a zmiany schematu są wykonywane jako rola właściciela, wówczas należy przypisać domyślne uprawnienia do tej roli właściciela. IMHO to wszystko jest trochę mylące i być może będziesz musiał poeksperymentować, aby wymyślić funkcjonalny przepływ pracy.
Wiele tabel / widoków (wersje PostgreSQL przed 9.0)
Aby uniknąć błędów w przypadku długich, wielostołowych zmian, zaleca się zastosowanie następującego „automatycznego” procesu w celu wygenerowania wymaganych ustawień GRANT SELECT
dla każdej tabeli / widoku:
SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');
To powinno wypisać odpowiednie polecenia GRANT do GRANT SELECT we wszystkich publicznych tabelach, widokach i sekwencjach, dla miłości kopiowania i wklejania. Oczywiście będzie to miało zastosowanie tylko do tabel, które zostały już utworzone.