PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak utworzyć użytkownika tylko do odczytu w PostgreSQL?

Przyznaj użycie/wybierz do jednej tabeli

Jeśli nadasz CONNECT tylko bazie danych, użytkownik może się połączyć, ale nie ma żadnych innych uprawnień. Musisz przyznać USAGE na przestrzeni nazw (schematy) i SELECT na tabelach i widokach indywidualnie, tak jak poniżej:

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 nadawać uprawnienia do wszystkich tabel/widoków/itd. w schemacie za pomocą jednego polecenia, zamiast wpisywania ich pojedynczo:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

Dotyczy to tylko tabel, które już zostały utworzone. Co więcej, w przyszłości możesz automatycznie przypisać 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 to również ustawić na dowolną rolę, której członkiem jest użytkownik wydający. Jednak podczas tworzenia nowych obiektów nie otrzymujesz domyślnych uprawnień dla wszystkich ról, których jesteś członkiem… więc wciąż jest trochę kłótni. W przypadku przyjęcia podejścia, zgodnie z którym baza danych ma rolę właściciela, a zmiany schematu są wykonywane jako rola właściciela, należy przypisać uprawnienia domyślne do tej roli właściciela. IMHO to wszystko jest trochę zagmatwane 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 długich, wielotabelowych zmianach, zaleca się użycie następującego „automatycznego” procesu w celu wygenerowania wymaganego GRANT SELECT do 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');

Powinno to wyprowadzić odpowiednie polecenia GRANT do GRANT SELECT we wszystkich publicznych tabelach, widokach i sekwencjach, aby uzyskać miłość kopiuj-n-wklej. Oczywiście zostanie to zastosowane tylko do tabel, które już zostały utworzone.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zastosować funkcję do każdego elementu kolumny tablicy w Postgresie?

  2. Jak wybrać tablicę 1d z tablicy 2d?

  3. PostgreSQL:Dlaczego psql nie może połączyć się z serwerem?

  4. Jak dodać po usunięciu ograniczeń kaskadowych?

  5. Dlaczego zapytanie nie zapisuje się w pliku csv, podczas gdy w konsoli postgresql wygląda to normalnie?