GRANT

Nom

GRANT -- définit les droits d'accès

Synopsis

GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] nomtable [, ...]
    TO { nomutilisateur | GROUP
nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]

GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE nombase [, ...]
    TO { nomutilisateur | GROUP
nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTION nomfonction
([type, ...]) [, ...]
    TO { nomutilisateur | GROUP
nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE nomlangage [, ...]
    TO { nomutilisateur | GROUP
nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]

GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA nomschéma [, ...]
    TO { nomutilisateur | GROUP
nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE nomespacelogique [, ...]
    TO { nomutilisateur | GROUP
nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]

Description

La commande GRANT donne des droits spécifiques sur un objet (table, vue, séquence, base de données, fonction, langage de procédure, schéma ou tablespace) à un ou plusieurs utilisateurs ou groupes d'utilisateurs. Ces droits sont ajoutés à ceux déjà obtenus.

Le mot clé PUBLIC indique que les droits sont donnés à tous les utilisateurs, y compris ceux qui seront créés ultérieurement. PUBLIC pourrait être vu comme un groupe implicitement défini qui inclut en permanence tous les utilisateurs. Un utilisateur particulier dispose de la somme des droits qui lui sont acquis, des droits de tout groupe dont il est membre et des droits donnés à PUBLIC.

Si WITH GRANT OPTION est spécifié, celui qui reçoit ce droit peut le donner à d'autres. Sans option GRANT, l'utilisateur ne peut pas le faire. Actuellement, les options de droits peuvent seulement être données à des utilisateurs individuels, pas à des groupes ou à PUBLIC.

Il n'y a pas besoin d'accorder des droits au propriétaire d'un objet (habituellement l'utilisateur qui l'a créé) car le propriétaire a tous les droits par défaut. (Le propriétaire pourrait, néanmoins, choisir de révoquer certains de ses propres droits.) Le droit de supprimer un objet ou de modifier sa définition n'est pas décrit par un droit donnable ; il est inhérent au propriétaire et ne peut être ni donné ni enlevé. Le propriétaire a aussi toutes les options GRANT sur cet objet.

Suivant le type de l'objet, PUBLIC peut avoir certains droits initiaux par défaut. La valeur par défaut est aucun accès public aux tables, schémas et espaces logiques ; droit de création de table TEMP pour les bases de données ; droit EXECUTE pour les fonctions ; et droit USAGE pour les langages. Le propriétaire de l'objet peut bien sûr choisir de révoquer ces droits. (Pour un maximum de sécurité, lancez REVOKE dans la même transaction que la création de l'objet ; ainsi, il n'y aura pas de laps temps pendant lequel un autre utilisateur pourrait utiliser l'objet.)

Les droits possibles sont :

SELECT

Autorise SELECT parmi toutes les colonnes de la table, vue ou séquence spécifiée. Autorise aussi l'utilisation de COPY TO. Ce droit est aussi nécessaire pour référencer des valeurs de colonnes existantes avec UPDATE ou DELETE. Pour les séquences, ce droit permet aussi l'utilisation de la fonction currval.

INSERT

Autorise INSERT d'une nouvelle ligne dans la table spécifiée. Autorise aussi COPY FROM.

UPDATE

Autorise UPDATE de toute colonne de la table spécifiée. (En fait, toute commande UPDATE non triviale nécessite aussi le droit SELECT car elle doit référencer les colonnes pour déterminer les lignes à mettre à jour et/ou calculer les nouvelles valeurs des colonnes.) SELECT ... FOR UPDATE requiert aussi ce droit en plus du droit SELECT. Pour les séquences, ce droit autorise l'utilisation des fonctions nextval et setval.

DELETE

Autorise DELETE d'une ligne pour la table spécifiée. (En fait, toute commande DELETE non triviale nécessite aussi le droit SELECT car elle doit référencer les colonnes pour déterminer les lignes à supprimer.)

RULE

Autorise la création d'une règle sur la table/vue. (Voir l'instruction CREATE RULE.)

REFERENCES

Pour créer une contrainte de clé étrangère, il est nécessaire d'avoir ce droit sur la table de référence et sur celle référencée.

TRIGGER

Autorise la création d'un déclencheur sur la table spécifiée. (Voir l'instruction CREATE TRIGGER.)

CREATE

Pour les bases de données, autorise la création de nouveaux schémas à l'intérieur de la base de données.

Pour les schémas, autorise la création de nouveaux objets dans le schéma. Pour renommer un objet existant, vous devez être le propriétaire de l'objet et avoir ce droit pour le schéma qui le contient.

Pour les espaces logiques (tablespaces), autorise la création de tables et d'index à l'intérieur du tablespace et autorise la création de bases de données ayant ce tablespace par défaut. (Notez que révoquer ce privilège ne modifie pas l'emplacement des objets existants.)

TEMPORARY
TEMP

Autorise la création de tables temporaires lors de l'utilisation de la base de données spécifiée.

EXECUTE

Autorise l'utilisation de la fonction spécifiée et l'utilisation de tout opérateur qui est implémenté avec cette fonction. C'est le seul type de droit qui est applicable aux fonctions. (Cette syntaxe fonctionne aussi pour les fonctions d'agrégat.)

USAGE

Pour les langages de procédures, autorise l'utilisation du langage spécifié pour la création de fonctions dans ce langage. Ceci est le seul type de droit applicable aux langages de procédures.

Pour les schémas, autorise l'accès aux objets contenus dans le schéma spécifié (en supposant que les besoins de droits des objets propres sont aussi respectés). Essentiellement, ceci permet à celui ayant reçu le droit de << rechercher >> les objets contenus dans ce schéma.

ALL PRIVILEGES

Donne tous les droits disponibles en une fois. Le mot clé PRIVILEGES est optionnel dans PostgreSQL bien qu'il soit requis par le SQL strict.

Les droits requis par d'autres commandes sont listés sur la page référencée de la commande respective.

Notes

La commande REVOKE est utilisée pour retirer les droits d'accès.

Quand un utilisateur, non propriétaire d'un objet, essaie de donner les droits GRANT de cet objet, la commande échoue si l'utilisateur n'a aucun droit sur l'objet. Si l'utilisateur dispose de droits, la commande continue mais ne donne que les droits pour lesquels l'utilisateur dispose de l'option GRANT. Les formes GRANT ALL PRIVILEGES affichent un message d'avertissement si aucune option GRANT n'est détenue. (En principe, ces instructions s'appliquent aussi au propriétaire de l'objet mais, comme ce dernier est toujours traité comme détenant les options GRANT, le cas n'arrive jamais.)

Il faut noter que les superutilisateurs de la base de données peuvent accéder à tous les objets sans paramétrage de droits sur les objets. Ceci est comparable aux droits de root sur un système Unix. Comme avec root, il est déconseillé d'opérer en tant que superutilisateur sauf lorsque cela est absolument nécessaire.

Si un superutilisateur choisit de lancer une commande GRANT ou REVOKE, la commande est exécutée comme si elle avait été lancée par le propriétaire de l'objet affecté. En particulier, les droits donnés via une telle commande semblent avoir été donnés par le propriétaire de l'objet.

Actuellement, PostgreSQL ne permet pas d'attribuer ou de révoquer des droits sur des colonnes individuelles d'une table. Un contournement possible est de créer une vue ayant les colonnes désirées et donner les droits GRANT sur cette vue.

Utilisez la commande \z de psql pour obtenir des informations sur les droits existants, par exemple :

=> \z matable

                        Access privileges for database "lusitania"
 Schema |  Name   | Type  |                     Access privileges
--------+---------+-------+-----------------------------------------------------
-------
 public | matable | table | {miriam=arwdRxt/miriam,=r/miriam,"group
todos=arw/miriam"}
(1 row)

Les entrées affichées par \z sont interprétées ainsi :

              =xxxx -- droits donnés à PUBLIC
         uname=xxxx -- droits donnés à un utilisateur
   group gname=xxxx -- droits donnés à un groupe

                  r -- SELECT ("lecture")
                  w -- UPDATE ("écriture")
                  a -- INSERT ("ajout")
                  d -- DELETE
                  R -- RULE
                  x -- REFERENCES
                  t -- TRIGGER
                  X -- EXECUTE
                  U -- USAGE
                  C -- CREATE
                  T -- TEMPORARY
            arwdRxt -- ALL PRIVILEGES (pour les tables)
                  * -- option de droit pour le droit précédant

              /yyyy -- utilisateur qui a donné ce droit

L'affichage de l'exemple ci-dessus pourrait être vue par l'utilisatrice miriam après la création de la table matable et le lancement de

GRANT SELECT ON matable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON matable TO GROUP todos;

Si la colonne << Access privileges >> est vide pour un objet donné, cela signifie que l'objet a les droits par défaut (c'est-à-dire que la colonne des droits est NULL). Les droits par défaut incluent toujours les droits pour le propriétaire et peuvent inclure quelques droits pour PUBLIC suivant le type d'objet comme expliqué ci-dessus. Le premier GRANT ou REVOKE sur un objet instancie les droits par défaut (produisant, par exemple, {=,miriam=arwdRxt/miriam}) puis les modifie par la requête spécifiée.

Notez que les options GRANT implicites du propriétaire ne sont pas indiquées dans l'affichage des droits d'accès. Une * apparaît seulement lorsque des options GRANT ont été explicitement données à quelqu'un.

Exemples

Donner le droit d'insertion à tous les utilisateurs sur la table films :

GRANT INSERT ON films TO PUBLIC;

Donner tous les droits à l'utilisateur manuel pour la vue genres :

GRANT ALL PRIVILEGES ON genres TO manuel;

Notez que, bien que la commande ci-dessus donne bien tous les droits si elle est exécutée par un superutilisateur ou par le propriétaire de genres, si elle est exécutée par quelqu'un d'autre, elle ne donne les droits qu'en accord avec ce que possède cet utilisateur.

Compatibilité

Suivant le standard SQL, le mot clé PRIVILEGES dans ALL PRIVILEGES est requis. Le standard SQL ne supporte pas l'initialisation des droits de plus d'un objet par commande.

PostgreSQL autorise un propriétaire d'objet à révoquer ses propres droits ordinaires : par exemple, le propriétaire d'un objet peut le placer en lecture seule pour lui-même en révoquant ses propres droits INSERT, UPDATE et DELETE. Ceci n'est pas possible d'après le standard SQL. La raison en est que PostgreSQL traite les droits du propriétaire comme ayant été donnés par le propriétaire ; du coup, il peut aussi les révoquer. Dans le standard SQL, les droits du propriétaires sont donnés par une entité << _SYSTEM >>. Sans être << _SYSTEM >>, le propriétaire ne peut pas révoquer ces droits.

Le standard SQL autorise l'initialisation de droits pour des colonnes spécifiques à l'intérieur d'une table :

GRANT droits
    ON table [ ( colonne [, ...] ) ] [, ...]
    TO { PUBLIC | nomutilisateur [,
...] } [ WITH GRANT OPTION ]

Le standard SQL fournit un droit USAGE sur d'autres types d'objets : ensembles de caractères, collations, traductions, domaines.

Le droit RULE et les droits sur les bases de données, les tablespaces, langages, schémas et séquences sont des extensions de PostgreSQL.

Voir aussi

REVOKE