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?


Nie jestem pewien, jak zaktualizować uprawnienia, aby móc czytać / pisać w DB
Boban


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.


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;

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;

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;

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;

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


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>;

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


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>;

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

-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;


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.