web-dev-qa-db-fra.com

ERREUR: permission refusée pour la séquence cities_id_seq à l'aide de Postgres

Je suis nouveau chez postgres (et dans les systèmes d’information de base de données). J'ai exécuté le script SQL suivant sur ma base de données:

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;

Quand, en tant qu'utilisateur www, essaye de:

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

Je reçois l'erreur suivante:

ERROR: permission denied for sequence cities_id_seq

Je comprends que le problème réside dans le type de série. C'est pourquoi j'accorde les droits select, insert et delete pour le fichier * _id_seq to www. Pourtant, cela ne résout pas mon problème. Qu'est-ce que je rate?

164
Vampnik

Depuis PostgreSQL 8.2, vous devez utiliser:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

GRANT USAGE - Pour les séquences, ce privilège permet l’utilisation des fonctions currval et nextval.

Également comme l'a souligné @epic_fil dans les commentaires, vous pouvez accorder des autorisations à toutes les séquences du schéma avec:

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

Puisque @Phil a un commentaire qui reçoit de nombreux votes positifs qui pourraient ne pas être remarqués, j'utilise sa syntaxe pour ajouter une réponse qui accordera des autorisations à un utilisateur pour toutes les séquences d'un schéma (en supposant que votre schéma est le paramètre 'public' par défaut.) )

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

@Tom_Gerken, @epic_fil et @kupson sont tout à fait corrects avec leurs instructions pour donner des autorisations pour travailler avec des séquences existantes. Cependant, l'utilisateur n'obtiendra PAS les droits d'accès aux séquences créées ultérieurement. Pour ce faire, vous devez associer l'instruction GRANT à une instruction ALTER DEFAULT PRIVILEGES, comme suit:

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

Cela ne fonctionne que sur PostgreSQL 9+, bien sûr.

Cela ajoutera les privilèges existants par défaut, ne les écrasera pas, donc est assez sûr à cet égard.

30
Asfand Qazi

Exécutez la commande suivante dans postgres.

connectez-vous à postgres:

Sudo su postgres;

psql nombase;

CREATE SEQUENCE public.cities_id_seq INCREMENT 1
MINVALUE 0
MAXVALUE 1
START 1 CACHE 1; ALTER TABLE public.cities_id_seq OWNER TO pgowner;

pgowner sera votre utilisateur de base de données.

0
Shreeram