314 votes

ERROR : permission refusée pour la séquence cities_id_seq utilisant Postgres

Je suis novice en matière de postgres (et de systèmes d'information sur les bases de données en général). J'ai exécuté le sql script 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, comme l'utilisateur www, essayant 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 des droits de sélection, d'insertion et de suppression pour le *_id_seq à www. Pourtant, cela ne résout pas mon problème. Que me manque-t-il ?

3 votes

Accorder l'insertion/suppression sur une séquence n'a aucun sens pour moi. Je suis même surpris que cela fonctionne.

564voto

kupson Points 1000

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 d'utiliser les fonctions currval et nextval.

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

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

Note : N'oubliez pas de choisir la base de données ( \c <database_name> ) avant d'exécuter les commandes d'octroi de privilèges

0 votes

Merci. Celui-ci a fonctionné. Je me demande juste si la façon dont j'accorde les droits à ces deux tables est la norme ou s'il existe un standard plus accepté quelque part. J'ai juste besoin que le www soit capable d'ajouter, de modifier et de supprimer des lignes.

0 votes

@Vampnik : Dans ce cas, vous devez ajouter UPDATE à toutes les tables. Pour les séquences, le USAGE, SELECT devrait suffire.

0 votes

@A.H. Merci pour le dernier. Je viens également de découvrir le dernier.

92voto

Tom Gerken Points 91

Puisque @Phil a un commentaire qui obtient beaucoup de votes positifs et qui pourrait ne pas être remarqué, j'utilise sa syntaxe pour ajouter une réponse qui accordera des permissions à un utilisateur pour toutes les séquences dans un schéma (en supposant que votre schéma est le schéma 'public' par défaut).

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

68voto

Asfand Yar Qazi Points 306

@Tom_Gerken, @epic_fil et @kupson ont tout à fait raison dans leurs déclarations de donner des autorisations pour travailler avec des séquences existantes. Cependant, l'utilisateur n'obtiendra PAS de droits d'accès aux séquences créées dans le futur. Pour ce faire, vous devez combiner l'instruction GRANT avec 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 s'ajoutera aux privilèges par défaut existants, sans les écraser, et est donc assez sûr à cet égard.

5voto

Codemaker Points 639

C'est dû à un problème de permission sur les SEQUENCES.

Essayez la commande suivante pour résoudre le problème,

GRANT USAGE, SELECT ON SEQUENCE sequence_name TO user_name;

Eg :

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

-4voto

Shreeram Points 3

Exécutez la commande suivante dans postgres.

Connectez-vous à Postgres :

sudo su postgres ;

psql dbname ;

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

pgowner sera l'utilisateur de votre base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X