ERRORE: autorizzazione negata per la sequenza cities_id_seq utilizzando Postgres


202

Sono nuovo su Postgres (e sui sistemi di informazione del database nel complesso). Ho eseguito il seguente script SQL sul mio database:

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;

Quando, come utente www, si tenta di:

insert into cities (name) values ('London');

Ottengo il seguente errore:

ERROR: permission denied for sequence cities_id_seq

Capisco che il problema risieda nel tipo seriale. Ecco perché concedo i diritti di selezione, inserimento ed eliminazione per * _id_seq a www. Eppure questo non risolve il mio problema. Cosa mi sto perdendo?


2
Concedere inserire / cancellare una sequenza non ha senso per me. Sono sorpreso che funzioni anche.
a_horse_with_no_name,

Risposte:


360

Da PostgreSQL 8.2 devi usare:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

UTILIZZO GRANT - Per le sequenze, questo privilegio consente l'uso delle funzioni currval e nextval.

Inoltre, come sottolineato da @epic_fil nei commenti, puoi concedere le autorizzazioni a tutte le sequenze nello schema con:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www;

52
Cordiali saluti, la sintassi "... SU TUTTE LE SEQUENZE IN SCHEMA nome_schema" è anche supportata.
epic_fil,

5
Interessante. Ho fatto un GRANT tutto sul tavolo in cui si trova la mia sequenza, ma questo non sembra coprire la sequenza. Anche questo sembra molto da OS.
Kinnard Hockenhull,

41
Come è una cosa reale? Quando mai vorrei consentire a un utente di inserire dati in una tabella ma NON volevo consentire loro di utilizzare il fatto che una delle colonne si auto-incrementa?
Brett Widmeier,

5
È SELECTnecessario? Non dovrebbe USAGEcoprire ciò che è necessario?
Martedì

6
@BrettWidmeier Exactly. Mi stupisce come questo genere di cose sia tollerato dagli sviluppatori. È come se le persone volessero vagare su Internet e leggere thread StackOverflow senza fondo nel tentativo di riparare cose che avrebbero dovuto funzionare immediatamente.
milosmns,

67

Poiché @Phil ha un commento che ottiene molti voti positivi che potrebbero non essere notati, sto usando la sua sintassi per aggiungere una risposta che garantirà le autorizzazioni a un utente per tutte le sequenze di uno schema (supponendo che lo schema sia il "pubblico" predefinito )

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public to www;

2
Nota che questo funziona solo in PostgreSQL 9.0 e versioni successive, per ottenere lo stesso risultato in 8 potresti fare qualcosa del tipo: SELEZIONA 'UTILIZZA CONCESSIONE, SELEZIONA SU' || quote_ident (schemaname) || '' || quote_ident (relname) || "TO www;" FROM pg_statio_all_sequences WHERE schemaname = 'public'; - Tom Gerken 2 giorni fa
Tom Gerken

39

@Tom_Gerken, @epic_fil e @kupson sono abbastanza corretti con le loro dichiarazioni per dare le autorizzazioni per lavorare con sequenze esistenti. Tuttavia, l'utente NON otterrà i diritti di accesso alle sequenze create in futuro. Per fare ciò, devi combinare l'istruzione GRANT con un'istruzione ALTER DEFAULT PRIVILEGES, in questo modo:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT USAGE, SELECT ON SEQUENCES TO www;

Questo funziona solo su PostgreSQL 9+, ovviamente.

Ciò si aggiungerà ai privilegi predefiniti esistenti, non li sovrascriverà, quindi è abbastanza sicuro al riguardo.


-2

Esegui il seguente comando in postgres.

accedi a postgres:

sudo su postgres;

psql dbname;

CREA SEQUENZA public.cities_id_seq INCREMENTO 1
MINVALUE 0
MAXVALUE 1
START 1 CACHE 1; ALTER TABLE public.cities_id_seq PROPRIETARIO A pgowner;

pgowner sarà il tuo utente del database.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.