Odmowa zgody na relację <tabela>

12

Uruchomiłem następujący SQL w psql:

CREATE USER bspu LOGIN;

CREATE DATABASE bsp OWNER bspu;

GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;

\c bsp

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client_id VARCHAR(20) NOT NULL,
  api_key VARCHAR(100) NOT NULL,
  api_secret VARCHAR(100) NOT NULL,
  auth_token VARCHAR(128) NOT NULL
);

Gdy loguję się jako bspui próbuję userswysłać zapytanie do tabeli, pojawia się błąd:

permission denied for relation users

Próbowałem uruchomić:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

Ale to nie pomaga. Co ja robię źle? Dlaczego właściciel bazy danych NIE ma uprawnień do przeszukiwania własnej bazy danych?

EDYCJA: Na razie uaktualniłem bspudo superużytkownika, więc mogę kontynuować pracę. Doceniamy wszelkie dalsze wskazówki.

jeśli __name__ to None
źródło
Co \dt "users"pokazuje produkcja?
bma,
@bma tylko mój główny acc jest wymieniony.
jeśli __name__ to None
Uruchomiłeś początkowe polecenia jako użytkownik? Co dostajesz SELECT session_user, current_useru góry skryptu? A jaka jest twoja wersja Postgres?
Erwin Brandstetter
Jeśli były to dokładnie te polecenia, które wykonałeś, nadal jesteś połączony z „głównym acc”. Sprowadza się to do tego, jakie masz uprawnienia . W przeciwnym razie zobacz doskonałą odpowiedź Erwina. (Przyznaję, że uważam za głupie, że ten komunikat o błędzie nie mówi, która rola nie ma uprawnień. Na przykład, kiedy uruchamia się łańcuch funkcji z DEFINIJNIKIEM BEZPIECZEŃSTWA, dość szybko staje się mylące, kto jest kim.)
dezso

Odpowiedzi:

22

DEFAULT PRIVILEGESczy nie zmienić uprawnienia dla istniejących obiektów. Są to domyślne uprawnienia dla nowo tworzonych obiektów i tylko dla określonej roli, do której należą. Jeśli rola nie zostanie zdefiniowana podczas działania ALTER DEFAULT PRIVILEGES, zostanie domyślnie ustawiona na bieżącą rolę (podczas wykonywania ALTER DEFAULT PRIVILEGESinstrukcji.

Ponadto, ponieważ używasz serialkolumny, która tworzy SEQUENCE, będziesz chciał również ustawić domyślne uprawnienia dla sekwencji.

Uruchom to na użytkowniku, z którym tworzysz obiekty, przed uruchomieniem CREATEpolecenia:

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;

Jeśli powinieneś użyć pgAdmin, słowo ostrzeżenia. W obecnej wersji 1.20 (lub starszej) występuje błąd w wyświetlaniu skryptu SQL dla inżynierii wstecznej DEFAULT PRIVILEGES. Wyświetlacz ignoruje właściciela i dlatego w niektórych sytuacjach jest nieprawidłowy. Zgłosiłem błąd, sprawa jest w toku .

W przypadku istniejących obiektów możesz być także zainteresowany tą „partią” formularza GRANTpolecenia :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO bspu;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO bspu;

Więcej pod tym powiązanym pytaniem na temat SO:

Erwin Brandstetter
źródło
1
Wspomniany błąd nadal występuje w pgAdmin4, patrz redmine.postgresql.org/issues/4685 , który został oznaczony jako duplikat redmine.postgresql.org/issues/4256
dpprdan
-1
This is working for me after some research. psql (9.6.12)

-- login to postgres database server as postgres user.
ssh <user>>@hostname.<domain>>.com
sudo su postgres
id
psql
postgres=# create user sentry_read with login password 'sentry_read';
postgres=# du+
postgres=# \l+
-- **very important: make sure we should connect required database before we grant to user.**
postgres=# \c sentry
postgres=# \dt
sentry=# \dp SENTRY_VERSION
sentry=# select * from "SENTRY_VERSION";
sentry=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sentry_read;
postgres=# \q

[user@hostname ~]$ psql -U sentry_read -d sentry -h hostname.<domain>>.com -W
sentry=> select * from "SENTRY_VERSION";
Srinu Mareti
źródło