Jestem nowy w postgres (i ogólnie w systemach informacyjnych baz danych). Uruchomiłem następujący skrypt SQL w mojej bazie danych:
create table cities (
id serial primary key,
name text not null
);
create table reports (
id serial primary key,
cityid integer not null references cities(id),
reportdate date not null,
reporttext text not null
);
create user www with password 'www';
grant select on cities to www;
grant insert on cities to www;
grant delete on cities to www;
grant select on reports to www;
grant insert on reports to www;
grant delete on reports to www;
grant select on cities_id_seq to www;
grant insert on cities_id_seq to www;
grant delete on cities_id_seq to www;
grant select on reports_id_seq to www;
grant insert on reports_id_seq to www;
grant delete on reports_id_seq to www;
Gdy jako użytkownik www próbuje:
insert into cities (name) values ('London');
Otrzymuję następujący błąd:
ERROR: permission denied for sequence cities_id_seq
Rozumiem, że problem leży w typie seryjnym. Dlatego udzielam prawa do wyboru, wstawiania i usuwania * _id_seq www. To jednak nie rozwiązuje mojego problemu. czego mi brakuje?
sql
postgresql
permissions
auto-increment
Vampnik
źródło
źródło
Odpowiedzi:
Od wersji PostgreSQL 8.2 musisz używać:
UŻYTKOWANIE DOTACJI - W przypadku sekwencji uprawnienie to umożliwia korzystanie z funkcji currval i nextval.
Jak wskazał @epic_fil w komentarzach, możesz udzielić uprawnień do wszystkich sekwencji w schemacie za pomocą:
źródło
SELECT
konieczne? Nie powinienUSAGE
pokrywać tego, co jest potrzebne?Ponieważ @Phil ma komentarz, który otrzymuje wiele pozytywnych opinii, które mogą nie zostać zauważone, używam jego składni, aby dodać odpowiedź, która przyzna użytkownikowi uprawnienia do wszystkich sekwencji w schemacie (zakładając, że twój schemat jest domyślnym „publicznym” )
źródło
@Tom_Gerken, @epic_fil i @kupson są całkiem poprawne ze swoimi instrukcjami, aby dać uprawnienia do pracy z istniejącymi sekwencjami. Jednak użytkownik NIE uzyska praw dostępu do sekwencji utworzonych w przyszłości. Aby to zrobić, musisz połączyć instrukcję GRANT z instrukcją ALTER DEFAULT PRIVILEGES, na przykład:
Oczywiście działa to tylko na PostgreSQL 9+.
Będzie to dołączać do istniejących domyślnych uprawnień, a nie nadpisywać ich, więc pod tym względem jest całkiem bezpieczne.
źródło
Wykonaj następujące polecenie w postgres.
zaloguj się do postgres:
pgowner będzie użytkownikiem bazy danych.
źródło