ERREUR: autorisation refusée pour la séquence cities_id_seq utilisant Postgres

202

Je suis nouveau chez postgres (et dans l'ensemble des 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;

Lorsque, en tant qu'utilisateur www, vous essayez de:

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

J'obtiens 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. Qu'est-ce que je rate?

Vampnik
la source
2
Accorder l'insertion / la suppression sur une séquence n'a pas de sens pour moi. Je suis surpris que cela fonctionne même.
a_horse_with_no_name

Réponses:

360

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.

Aussi, comme indiqué par @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;
kupson
la source
52
Pour info, la syntaxe "... SUR TOUTES LES SÉQUENCES DANS SCHEMA nom_schéma" est également prise en charge.
epic_fil
5
Intéressant. J'ai fait un GRANT sur la table où se trouve ma séquence, mais cela ne semble pas couvrir la séquence. Cela semble également très par OS.
Kinnard Hockenhull
42
Comment est-ce réel? Quand voudrais-je jamais autoriser un utilisateur à insérer des données dans une table mais PAS lui permettre d'utiliser le fait que l'une des colonnes s'incrémente automatiquement?
Brett Widmeier
5
EST SELECTnécessaire? Ne devrait pas USAGEcouvrir ce qui est nécessaire?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
7
@BrettWidmeier Exactement. C'est stupéfiant pour moi de voir comment ce genre de chose est toléré par les développeurs. C'est comme si les gens voulaient se promener sur Internet et lire des threads StackOverflow sans fond pour tenter de réparer des choses qui auraient dû fonctionner dès la sortie de la boîte.
milosmns
67

Étant donné que @Phil a un commentaire obtenant beaucoup de 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 `` public '' par défaut) )

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public to www;
Tom Gerken
la source
2
Notez que cela ne fonctionne que dans PostgreSQL 9.0 et versions ultérieures, pour accomplir la même chose dans 8, vous pouvez faire quelque chose comme: SELECT 'GRANT USAGE, SELECT ON' || quote_ident (schemaname) || "." || quote_ident (relname) || «À www;» FROM pg_statio_all_sequences WHERE schemaname = 'public'; - Tom Gerken il y a 2 jours
Tom Gerken
39

@Tom_Gerken, @epic_fil et @kupson sont tout à fait corrects avec leurs déclarations pour 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 à l'avenir. Pour ce faire, vous devez combiner l'instruction GRANT avec une instruction ALTER DEFAULT PRIVILEGES, comme ceci:

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 bien sûr que sur PostgreSQL 9+.

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

Asfand Qazi
la source
-2

Exécutez la commande suivante dans postgres.

connectez-vous à postgres:

sudo su postgres;

psql dbname;

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.

Shreeram
la source