Odmowa zgody na relację

329

Próbowałem uruchomić proste polecenie SQL:

select * from site_adzone;

i dostałem ten błąd

ERROR:  permission denied for relation site_adzone

W czym może być problem?

Próbowałem również wybrać opcję dla innych tabel i dostałem ten sam problem. Próbowałem także to zrobić:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

ale dostałem tę odpowiedź z konsoli

WARNING:  no privileges were granted for "jerry"

Czy masz pojęcie, co może być nie tak?

Boban
źródło
Nie jestem pewien, jak zaktualizować uprawnienia, aby móc czytać / pisać w DB
Boban
1
Musisz przyznać niezbędne uprawnienia: postgresql.org/docs/current/static/ddl-priv.html i postgresql.org/docs/current/static/sql-grant.html
a_horse_w__nazwa
2
Witamy w SO! W przypadku tego pytania możesz uzyskać więcej pomocy na stronie dba.stackexchange.com, chociaż możesz znaleźć równie wiele złośliwych komentarzy :)
Jared Beck
10
Przepraszam. To jest drugie bardzo związane z programowaniem pytanie postgresql, które dziś uważałem za nieaktualne! Ostatni miał 67 000 wyświetleń, ten 30 000 wyświetleń. Powinniśmy mieć klauzulę popularności: Wszelkie nie subiektywne pytania o> 15 000 wyświetleń = na temat.
Theodore R. Smith,
1
To pytanie nie jest tematem! Jest to jednak powielanie stackoverflow.com/questions/13497352/...
wheaties

Odpowiedzi:

391

GRANT w bazie danych nie jest tym, czego potrzebujesz. Przyznaj bezpośrednio do stołów.

Nadawanie uprawnień do bazy danych służy głównie do przyznawania lub cofania uprawnień do połączenia. Pozwala to określić, kto może wykonywać czynności w bazie danych, jeśli mają wystarczające inne uprawnienia.

Zamiast tego chcesz:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

Zajmie się tym problemem.

Chris Travers
źródło
7
uruchom go jako superużytkownik, jak postgres.
Chris Travers
19
Czy można to jakoś skrócić? UDZIELAĆ WSZYSTKICH UPRAWNIEŃ NA WSZYSTKICH STOŁACH?
Shadur
196
@Shadur UDZIELAJ WSZYSTKICH UPRAWNIEŃ NA WSZYSTKICH STÓŁACH W SCHEMIE public TO Jerry;
Ron E
10
@RonE jest jednak ograniczony do bieżącej bazy danych?
Shadur,
7
@zmiftah dla schematu, którego potrzebujesz> PRZYZNACZ WSZYSTKIE UPRAWNIENIA NA SCHEMIE nameSchema TO user;
Pierozi
241

Opublikowanie odpowiedzi Ron E na przyznanie uprawnień na wszystkich stołach, ponieważ może to być przydatne dla innych.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
zwis
źródło
21
Może być także konieczne wykonanie podobnej komendy dla ALL SEQUENCESi ALL FUNCTIONS.
Pistos
7
Tylko dla tych, którzy zastanawiali się: ALL TABLESzawiera także widoki, więc nie ma osobnego ALL VIEWSpolecenia :-)
André Gasser
74

Najpierw połącz się z właściwą bazą danych , a następnie uruchom:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
użytkownik2757813
źródło
4
dzięki podłączeniu do właściwej bazy danych NIE robiłem wcześniej!
asgs
15
połączenie z właściwą bazą danych sprawia OGROMNE obawy :)\connect databasename;
Denis Matafonov
3
TO. Przez cały czas byłem połączony z „postgres”. Dziękuję Ci!
Andrew G.
2
Tak, połączenie z DB zrobiło różnicę
inostia
44
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;
Klanjabrik
źródło
ta odpowiedź uratowała mi dzień!
anhtran
19

Pierwszym i ważnym krokiem jest połączenie z bazą danych:

psql -d yourDBName

2 krok, nadaj uprawnienia

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;
zond
źródło
18

Aby udzielić uprawnień wszystkim istniejącym tabelom w schemacie, użyj:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role>

Aby określić domyślne uprawnienia, które będą stosowane do przyszłych tabel, użyj:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
  GRANT <privileges> ON TABLES TO <role>;

na przykład

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin;

Jeśli użyjesz SERIALlub BIGSERIALkolumn, prawdopodobnie będziesz chciał zrobić to samo SEQUENCES, bo inaczej INSERTzawiedzie ( Postgres 10IDENTITY nie cierpi z powodu tego problemu i jest zalecany w stosunku do SERIALtypów), tj.

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

Zobacz także moją odpowiedź na PostgreSQL Uprawnienia do aplikacji sieci Web, aby uzyskać więcej informacji i skrypt wielokrotnego użytku.

Ref:

DOTACJA

ZMIEŃ DOMYŚLNE PRZYWILEJE

isapir
źródło
9

Zdarza się to często, gdy tworzysz tabelę jako użytkownik postgres, a następnie próbujesz uzyskać do niej dostęp jako zwykły użytkownik. W takim przypadku najlepiej zalogować się jako użytkownik postgres i zmienić własność tabeli za pomocą polecenia:

alter table <TABLE> owner to <USER>;
Bruce
źródło
5

Upewnij się, że logujesz się do psql jako właściciel tabel. aby dowiedzieć się, kto jest właścicielem tabel\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

wtedy możesz uruchomić DOTACJE

Brian McCall
źródło
0

Gdy szukasz wybranych uprawnień, sugeruję, abyś udzielił tylko wybranych, a nie wszystkich uprawnień. Możesz to zrobić przez:

GRANT SELECT ON <table> TO <role>;
Sergi Ramón
źródło
0

Powinieneś:

  1. połączyć się z bazą danych za pomocą DBeavera z użytkownikiem postgres
  2. na lewej karcie otwórz bazę danych
  3. otwórz zakładkę / menu Role
  4. wybierz użytkownika
  5. na prawej karcie naciśnij „kartę Uprawnienia”
  6. naciśnij kartę schematu
  7. naciśnij tab / rozwijane tabele
  8. wybierz wszystkie tabele
  9. zaznacz wszystkie wymagane pola wyboru uprawnień (lub naciśnij Przyznaj wszystkie)
  10. naciśnij Zapisz
happydmitry
źródło
-3

Raz spotkałem się z tym problemem. wystarczy zmienić użytkownika bazy danych na administratora, a problem zostanie rozwiązany.

ALTER USER myuser WITH SUPERUSER;

Adebayo Ogunmoriyele
źródło
Robiąc to, przyznajesz więcej premii, niż potrzebujesz. Superuser udzieli im uprawnień do innych operacji, których użytkownik może nie chcieć wykonywać, takich jak tworzenie innych użytkowników, baz danych itp.
Santi