Jak wyświetlić zapytanie o inną sesję w pg_stat_activity bez superużytkownika?

13

Mam bazę danych Postgresql 9.2. W tej bazie danych utworzono dwóch użytkowników. Kiedy wykonuję następujące zapytanie jako superużytkownik, widzę wszystko.

select * from pg_stat_activity

Czy jednak można osiągnąć ten sam wynik bez połączenia z administratorem?

Jaką uprawnienie / rolę powinienem przyznać / utworzyć, aby uzyskać wyniki, które superużytkownik może zobaczyć?

Stephan
źródło
W tym momencie nie ma prawa do przyznania, jest na stałe przypisane do administratora. Zostało to ostatnio omówione na liście mailingowej i może ulec zmianie w wersji 9.5, jeśli ktoś znajdzie czas, aby nad tym popracować.
Craig Ringer

Odpowiedzi:

21

W tym momencie nie ma prawa do przyznania, jest na stałe przypisane do administratora. Zostało to ostatnio omówione na liście mailingowej i może ulec zmianie w wersji 9.5, jeśli ktoś znajdzie czas, aby nad tym popracować.

Aby obejść ten problem, możesz utworzyć SECURITY DEFINERfunkcję, która jest własnością administratora i uruchamia żądane zapytanie. Umożliwi to osobom niebędącym superużytkownikami przeglądanie zawartości pg_stat_activitypoprzez wywołanie funkcji.

Na przykład uruchom jako superużytkownik:

CREATE FUNCTION get_sa() RETURNS SETOF pg_stat_activity AS
$$ SELECT * FROM pg_catalog.pg_stat_activity; $$
LANGUAGE sql
VOLATILE
SECURITY DEFINER;

CREATE VIEW pg_stat_activity_allusers AS SELECT * FROM get_sa();

GRANT SELECT ON pg_stat_activity_allusers TO public;

Pamiętaj, że bezpłatny dostęp pg_stat_activityjest ograniczony z jakiegoś powodu. Można wyszukiwać poufne informacje z zapytań innych osób - wyobraź sobie na przykład, że inny użytkownik używa pgcrypto. Zamiast przyznawać prawa publicużytkownikowi, należy je przyznać tylko określonemu użytkownikowi lub roli, która ma pełnić rolę użytkownika zastępczego do monitorowania.

Craig Ringer
źródło
Dzięki! Właśnie próbowałem wymyślić, jak udzielić kontu monitora uprawnienia do odczytu z pg_stat_activity bez udzielania SUPERUSER.
epic_fil
3

Począwszy od PostgreSQL 10, możesz przyznać rolę pg_read_all_stats, aby osiągnąć pożądany rezultat.

Radu Dumbrăveanu
źródło