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?
sql
postgresql
permissions
auto-increment
Vampnik
la source
la source
Réponses:
Depuis PostgreSQL 8.2, vous devez utiliser:
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:
la source
SELECT
nécessaire? Ne devrait pasUSAGE
couvrir ce qui est nécessaire?É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) )
la source
@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:
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.
la source
Exécutez la commande suivante dans postgres.
connectez-vous à postgres:
pgowner sera votre utilisateur de base de données.
la source