GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
Użytkownik tylko do odczytu może się połączyć, zobaczyć tabele, ale kiedy próbuje wykonać prosty wybór, otrzymuje:
ERROR: permission denied for relation mytable
SQL state: 42501
Dzieje się tak w PostgreSQL 9.1
Co zrobiłem źle?
postgresql
sorin
źródło
źródło
Odpowiedzi:
Oto kompletne rozwiązanie dla PostgreSQL 9+, zaktualizowane niedawno.
CREATE USER readonly WITH ENCRYPTED PASSWORD 'readonly'; GRANT USAGE ON SCHEMA public to readonly; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; -- repeat code below for each database: GRANT CONNECT ON DATABASE foo to readonly; \c foo ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo" GRANT USAGE ON SCHEMA public to readonly; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly; GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
Podziękowania dla https://jamie.curle.io/creating-a-read-only-user-in-postgres/ za kilka ważnych aspektów
Jeśli ktoś znajdzie krótszy kod, a najlepiej taki, który jest w stanie wykonać to dla wszystkich istniejących baz danych, dodatkowe gratyfikacje.
źródło
GRANT ALL
domyślnie dajesz to uprawnienie użytkownikowi tylko do odczytu?\ddp
. Powinien=r/
wyglądać tak samo, jak wgranting_user=r/readonly_user
przypadku dostępu tylko do odczytu.Spróbuj dodać
GRANT USAGE ON SCHEMA public to readonly;
Prawdopodobnie nie byłeś świadomy, że trzeba mieć wymagane uprawnienia do schematu, aby używać obiektów w schemacie.
źródło
psql
jakopostgres
użytkownik i zrobić uzyskać właściwą odpowiedź,GRANT
. Mimo to, gdy patrzę na listę ACL w tabelach, widzę tylko dwa inne konta, jedno będące właścicielem bazy danych,jirauser
a drugie o nazwie tylko do odczytuqauser
. Ale mojego tamreadonly
nie ma. Postgres to wersja 9.1 i nawet zrestartowałem serwer, nadal nic się nie dzieje.To zadziałało dla mnie:
Sprawdź bieżącą rolę, do której jesteś zalogowany, używając: SELECT CURRENT_USER, SESSION_USER;
Uwaga : musi pasować do właściciela schematu.
Schemat | Imię | Wpisz | Właściciel
-------- + -------- + ------- + ----------
Jeśli właściciel jest inny, przekaż wszystkie uprawnienia bieżącej roli użytkownika z roli administratora poprzez:
GRANT „ROLE_OWNER” dla „CURRENT ROLENAME”;
Następnie spróbuj wykonać zapytanie, da wynik, ponieważ ma teraz dostęp do wszystkich relacji.
źródło
upewnij się, że użytkownik ma atrybuty przypisane do swojej roli. na przykład:
postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- flux | | {} postgres | Superuser, Create role, Create DB, Replication | {}
po wykonaniu polecenia:
postgres=# ALTER ROLE flux WITH Superuser; ALTER ROLE postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- flux | Superuser | {} postgres | Superuser, Create role, Create DB, Replication | {}
rozwiązało problem.
zobacz samouczek dotyczący ról i innych rzeczy tutaj: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2
źródło
ERROR: permission denied for relation mytable
Powinieneś wykonać następne zapytanie:
GRANT ALL ON TABLE mytable TO myuser;
Lub jeśli twój błąd jest w widoku, być może tabela nie ma uprawnień, więc powinieneś wykonać następne zapytanie:
GRANT ALL ON TABLE tbm_grupo TO myuser;
źródło
ALTER DROP DELETE
Tylko do odczytu”, jeśli dajesz Ect. Do tego użytkownika ...