Nadaj wszystko w określonym schemacie w bazie danych roli grupy w PostgreSQL

93

Używając PostgreSQL 9.0, mam rolę grupy o nazwie "personel" i chciałbym nadać wszystkie (lub niektóre) uprawnienia do tej roli w tabelach w określonym schemacie. Żadna z poniższych prac

GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;

Członkowie „personelu” nadal nie mogą WYBIERAĆ lub AKTUALIZOWAĆ poszczególnych tabel w schemacie „foo” lub (w przypadku drugiego polecenia) żadnej tabeli w bazie danych, chyba że udzielę wszystkiego w tej konkretnej tabeli.

Co mogę zrobić, aby ułatwić życie moje i moim użytkownikom?

Aktualizacja: odgadłem to za pomocą podobnego pytania na serverfault.com .

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
punkowy
źródło

Odpowiedzi:

125

Znalazłeś skrót do ustawiania uprawnień dla wszystkich istniejących tabel w podanym schemacie. Instrukcja wyjaśnia :

(ale należy pamiętać, że ALL TABLESobejmuje to widoki i tabele obce ).

Odważne podkreślenie moje. serialkolumny są zaimplementowane z nextval()sekwencją jako domyślną kolumną i cytując instrukcję :

W przypadku sekwencji to uprawnienie umożliwia korzystanie z funkcji currvali nextval.

Więc jeśli są serialkolumny, będziesz chciał również przyznać USAGE(lub ALL PRIVILEGES) na sekwencje

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

Uwaga: kolumny tożsamości w Postgres 10 lub nowszym używają niejawnych sekwencji, które nie wymagają dodatkowych uprawnień. (Rozważ uaktualnienie serialkolumn).

A co z nowymi obiektami?

Będziesz także zainteresowany DEFAULT PRIVILEGESużytkownikami lub schematami :

ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE          ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;

Powoduje to automatyczne nadawanie uprawnień obiektom utworzonym w przyszłości, ale nie obiektom już istniejącym.

Domyślne uprawnienia są stosowane tylko do obiektów utworzonych przez docelowego użytkownika ( FOR ROLE my_creating_role). Jeśli ta klauzula zostanie pominięta, domyślnie jest wykonywany przez bieżącego użytkownika ALTER DEFAULT PRIVILEGES. Mówiąc wprost:

ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;

Zauważ również, że wszystkie wersje pgAdmin III mają subtelny błąd i wyświetlają domyślne uprawnienia w panelu SQL, nawet jeśli nie mają one zastosowania do bieżącej roli. Pamiętaj o FOR ROLEręcznym dostosowaniu klauzuli podczas kopiowania skryptu SQL.

Erwin Brandstetter
źródło
2
żebyś wiedział, Erwin, 10 minut po tym, jak opublikowałeś swoją radę, potrzebowałem jej. To tak, jakbyś wiedział, co zamierzam zrobić ... stworzyć nowy stół i odkryć, że nie ma odpowiednich uprawnień. Twoja odpowiedź przyszła na ratunek.
punkowy
5
@punkish: Domagam się odznaki! Cholera, to już zostało użyte do czegoś innego.
Erwin Brandstetter
Po uruchomieniu ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;skąd wie, jaka baza danych? SCHEMA foomoże istnieć w innej bazie danych?
J86,
2
@ J86: dotyczy tylko bieżącej bazy danych - gdzie polecenie jest wykonywane.
Erwin Brandstetter
1
@ErwinBrandstetter Czy mogę udzielić dostępu do przyszłych tabel / sekwencji użytkownikowi aplikacji (do odczytu i zapisu), pod warunkiem, że tabele zostaną utworzone automatycznie przez innego dedykowanego użytkownika migracyjnego (migracje flyway są uruchamiane podczas uruchamiania aplikacji)?
leksem
45

Moja odpowiedź jest podobna do tej na ServerFault.com .

Być konserwatywnym

Jeśli chcesz być bardziej konserwatywny niż przyznawanie „wszystkich przywilejów”, możesz spróbować czegoś podobnego.

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO some_user_;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO some_user_;

Użycie publictam odnosi się do nazwy domyślnego schematu tworzonego dla każdej nowej bazy danych / katalogu. Zastąp własną nazwą, jeśli utworzyłeś schemat.

Dostęp do schematu

Aby w ogóle uzyskać dostęp do schematu, dla dowolnej akcji, użytkownikowi należy przyznać prawa „użytkowania”. Zanim użytkownik będzie mógł wybierać, wstawiać, aktualizować lub usuwać, musi najpierw przyznać mu „użycie” do schematu.

Nie zauważysz tego wymagania podczas pierwszego korzystania z Postgres. Domyślnie każda baza danych ma pierwszy schemat o nazwie public. Każdemu użytkownikowi domyślnie przyznano automatycznie prawa „użytkowania” do tego konkretnego schematu. Podczas dodawania dodatkowego schematu musisz jawnie przyznać prawa użytkowania.

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

Fragment z dokumentu Postgres :

W przypadku schematów umożliwia dostęp do obiektów zawartych w określonym schemacie (przy założeniu, że spełnione są również własne wymagania dotyczące uprawnień obiektów). Zasadniczo umożliwia to beneficjentowi „wyszukiwanie” obiektów w schemacie. Bez tego uprawnienia nadal można zobaczyć nazwy obiektów, np. Poprzez odpytywanie tabel systemowych. Ponadto po odwołaniu tego uprawnienia istniejące zaplecze mogą zawierać instrukcje, które wcześniej wykonywały to wyszukiwanie, więc nie jest to całkowicie bezpieczny sposób zapobiegania dostępowi do obiektów.

Aby uzyskać więcej informacji, zobacz Pytanie, Co dokładnie robi GRANT USAGE ON SCHEMA? . Zwróć szczególną uwagę na odpowiedź eksperta Postgres, Craiga Ringera .

Istniejące obiekty a przyszłość

Te polecenia mają wpływ tylko na istniejące obiekty. Tabele i takie, które utworzysz w przyszłości, otrzymają domyślne uprawnienia, dopóki nie wykonasz ponownie tych wierszy powyżej. Zobacz drugą odpowiedź Erwina Brandstettera, aby zmienić ustawienia domyślne, wpływając w ten sposób na przyszłe obiekty.

Basil Bourque
źródło
1
oprócz dwóch powyższych dotacji potrzebna jest jeszcze jedna dotacja: PRZYZNANIE UŻYCIA W RAMACH SCHEMATU publiczny DLA some_user_;
Ning Liu
1
@NingLiu Bardzo dziękuję za wskazanie GRANT USAGE i za nauczenie mnie tego. Dodałem sekcję do odpowiedzi.
Basil Bourque
DOTACJA WYKORZYSTANIA W PROGRAMIE jest tym, czego szukałem.
Basil Musa