Vous n'êtes pas identifié(e).
Bonjour à tous,
J'ai une question (sûrement toute bête) sur la création de table dans une base (moteur en version 8.4).
Je crée une base avec l'utilisateur postgres (superadmin) : toto
Je crée un utilisateur basique : titi (juste un "create user").
Je donne les droits à l'utilisateur titi de se connecter sur la base toto et il a le droit de créer des tables. C'est normal ? (j'imagine que oui ), Peut on limiter ce droit ?
Merci pour votre aide
Dernière modification par pitpoule (10/09/2010 10:56:18)
Hors ligne
Tout le monde a le droit de créer des tables dans le schéma par défaut qu'est public. Il est possible de supprimer ce droit (instruction REVOKE, http://docs.postgresql.fr/8.4/sql-revoke.html) comme il est possible de créer un autre schéma qui ne pourra être modifié que par son propriétaire (il ne faudra pas oublier de supprimer ou verrouiller public).
Guillaume.
Hors ligne
ok, merci pour les infos
Hors ligne
Je reviens à la charge parce que je n'arrive pas à faire ce que je veux avec le revoke.
Je reprends depuis le début. Je crée une base toto
postgres=# create database toto;
CREATE DATABASE
Je crée ensuite l'utilisateur pitpoule
postgres=# create database toto;
CREATE DATABASE
Je revoke tous les droits à public et pitpoule pour être sur que personne ne peut rien faire
postgres=# REVOKE ALL ON DATABASE toto from public;
REVOKE
postgres=# REVOKE ALL ON DATABASE toto from pitpoule;
REVOKE
J'essaye de me connecte avec pitpoule, je n'y arrive pas, logique
root:/var/pgsql8.4/data# psql -U pitpoule -d toto
psql: FATAL: permission denied for database "toto"
DETAIL: User does not have CONNECT privilege.
Maintenant je donne juste les droits de connect à pitpoule et j'arrive quand même à créer un table
postgres=# GRANT CONNECT ON DATABASE toto to pitpoule;
GRANT
root:/var/pgsql8.4/data# psql -U pitpoule -d toto
psql (8.4.4)
Type "help" for help.
toto=> create table test (i integer);
CREATE TABLE
?? Qu'est ce que j'ai loupé ?
Hors ligne
Que le REVOKE sur database n'est pas récursif : il revoke les droits sur l'objet DATABASE, pas sur les objets qu'il contient.
Marc.
Hors ligne
Que le REVOKE sur database n'est pas récursif : il revoke les droits sur l'objet DATABASE, pas sur les objets qu'il contient.
J'ai du mal à saisir, créer une table dans une base ce n'est pas un droit sur l'objet DATABASE ?
Quelle serait alors la commande correcte ?
Hors ligne
Non, le droit de créer une table dans une base, c'est en fait créer une table dans un schéma dans une base.
Donc pour l'interdire, c'est REVOKE CREATE ON SCHEMA public FROM pitpoule;
Cela interdit à l'utilisateur pitpoule la création d'un schéma.
Par ailleurs, si pitpoule est propriétaire de la base, il lui reste encore le droit de créer d'autres schéma
Dernière modification par Marc Cousin (10/09/2010 16:59:24)
Marc.
Hors ligne
Cela interdit à l'utilisateur pitpoule la création d'un schéma.
Pour être précis, l'ordre SQL "REVOKE CREATE ON SCHEMA public FROM pitpoule;" interdit la création de n'importe quel type d'objets dans le schéma public pour l'utilisateur pitpoule.
Guillaume.
Hors ligne
J'oubliais...
Par ailleurs, si pitpoule est propriétaire de la base, il lui reste encore le droit de créer d'autres schéma
Et des langages et des conversions et des tablespaces.
Guillaume.
Hors ligne
Merci pour vos réponses, j'y vois un peu plus clair maintenant.
Un dernière pour la route : du coup quelles sont les bonnes pratiques à avoir sur une base de prod ? On doit systématiquement créer un nouveau schéma "privé" pour chaque base ?
Hors ligne
On peut créer un schéma privé, on peut aussi supprimer les droits sur le schéma public.
Guillaume.
Hors ligne