REVOKE — supprime les droits d'accès
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]nom_table
[, ...] | ALL TABLES IN SCHEMAnom_schéma
[, ...] } FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } (nom_colonne
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (nom_colonne
[, ...] ) } ON [ TABLE ]nom_table
[, ...] FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEnom_séquence
[, ...] | ALL SEQUENCES IN SCHEMAnom_schéma
[, ...] } FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEnom_base
[, ...] FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAINnom_domaine
[, ...] FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERnom_fdw
[, ...] FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERnom_serveur
[, ...] FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTIONnom_fonction
[ ( [ [mode_arg
] [nom_arg
]type_arg
[, ...] ] ) ] [, ...] | ALL FUNCTIONS IN SCHEMAnom_schéma
[, ...] } FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGEnom_lang
[, ...] FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAnom_schéma
[, ...] FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEnom_tablespace
[, ...] FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPEnom_type
[, ...] FROMspécification_rôle
[, ...] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ]nom_role
[, ...] FROMspécification_rôle
[, ...] [ GRANTED BYspécification_rôle
] [ CASCADE | RESTRICT ] oùspécification_rôle
peut valoir : [ GROUP ]nom_rôle
| PUBLIC | CURRENT_USER | SESSION_USER
La commande REVOKE
retire des droits précédemment
attribués à un ou plusieurs rôles.
Le mot clé PUBLIC
fait référence au groupe implicitement
défini de tous les rôles.
Voir la description de la commande GRANT pour connaître la signification des types de droits.
Notez qu'un rôle possède la somme des droits qui lui ont été donnés
directement, des droits qui ont été donnés à un rôle dont il est membre
et des droits donnés à PUBLIC
.
Du coup, par exemple, retirer les droits de SELECT
à
PUBLIC
ne veut pas nécessairement dire que plus aucun rôle
n'a le droit de faire de SELECT
sur l'objet : ceux qui en
avaient obtenu le droit directement ou via un autre rôle l'ont toujours.
De même, révoquer SELECT
d'un utilisateur ne l'empêchera
peut-être pas d'utiliser SELECT
si PUBLIC
ou un autre de ses rôle a toujours les droits SELECT
.
Si GRANT OPTION FOR
est précisé, seul l'option
de transmission de droit (grant option) est supprimée, pas le
droit lui même. Sinon, le droit et l'option de transmission de droits sont
révoqués.
Si un utilisateur détient un privilège avec le droit de le transmettre,
et qu'il l'a transmis à d'autres utilisateurs, alors les droits de
ceux-ci sont appelés des droits dépendants.
Si les droits ou le droit de transmettre du premier utilisateur sont
supprimés, et que des droits dépendants existent, alors ces droits
dépendants sont aussi supprimés si l'option CASCADE
est utilisée. Dans le cas contraire, la suppression de droits est refusée.
Cette révocation récursive n'affecte que les droits qui avaient
été attribués à travers une chaîne d'utilisateurs traçable jusqu'à
l'utilisateur qui subit la commande REVOKE
.
Du coup, les utilisateurs affectés peuvent finalement garder le droit s'il
avait aussi été attribué via d'autres utilisateurs.
En cas de révocation des droits sur une table, les droits sur les colonnes correspondantes (s'il y en a) sont automatiquement révoqués pour toutes les colonnes de la table en même temps. D'un autre côté, si un rôle a des droits sur une table, supprimer les mêmes droits pour des colonnes individuelles n'aura aucun effet.
Lors de la révocation de l'appartenance d'un rôle, GRANT
OPTION
est appelé ADMIN OPTION
mais le
comportement est similaire. Cette syntaxe de la commande autorise aussi une
option GRANTED BY
mais cette option est actuellement
ignorée (sauf pour vérifier l'existence du rôle nommé). Notez aussi que
cette forme de la commande ne permet pas le mot GROUP
.
dans role_specification
.
Utilisez la commande \dp
de psql
pour afficher les droits donnés sur des tables et colonnes. Voir GRANT pour plus d'informations sur
le format. Pour les objets qui ne sont pas des tables, il existe d'autres
commandes \d
qui peuvent afficher leurs droits.
Un utilisateur ne peut révoquer que les droits qu'il a donnés
directement. Si, par exemple, un utilisateur A a donné un droit
et la possibilité de le transmettre à un utilisateur B, et que
B à son tour l'a donné à C, alors A ne peut pas retirer directement
le droit de C. À la place, il peut supprimer le droit de transmettre à B et
utiliser l'option CASCADE
pour que le droit soit
automatiquement supprimé à C. Autre exemple, si A et B ont donné le même
droit à C, A peut révoquer son propre don de droit mais pas celui de B, donc
C dispose toujours de ce droit.
Lorsqu'un utilisateur, non propriétaire de l'objet, essaie de révoquer
(REVOKE
) des droits sur l'objet, la commande échoue si
l'utilisateur n'a aucun droit sur l'objet. Tant que certains droits sont
disponibles, la commande s'exécute mais ne sont supprimés que les
droits dont l'utilisateur a l'option de transmission. La forme
REVOKE ALL PRIVILEGES
affiche un message d'avertissement si
les options de transmissions pour un des droits nommés spécifiquement dans
la commande ne sont pas possédés. (En principe, ces instructions
s'appliquent aussi au propriétaire de l'objet mais comme le propriétaire est
toujours traité comme celui détenant toutes les options de transmission, ces
cas n'arrivent jamais.)
Si un superutilisateur choisit d'exécuter une commande GRANT
ou REVOKE
, la commande est exécutée comme si elle était
lancée par le propriétaire de l'objet affecté.
Comme tous les droits proviennent du propriétaire d'un objet (directement
ou via une chaîne de transmissions de droits), un superutilisateur
peut supprimer tous les droits sur un objet mais cela peut nécessiter
l'utilisation de CASCADE
comme expliqué précédemment.
REVOKE
peut aussi être effectué par un rôle qui n'est pas le
propriétaire de l'objet affecté mais qui est un membre du rôle qui possède
l'objet ou qui est un membre d'un rôle qui détient les droits
WITH GRANT OPTION
sur cet objet. Dans ce cas, la commande
est exécutée comme si elle avait été exécutée par le rôle qui possède
réellement l'objet ou détient les droits WITH GRANT
OPTION
. Par exemple, si la table t1
est possédée par
le rôle g1
, dont le rôle u1
est membre, alors
u1
peut supprimer des droits sur t1
qui sont
enregistrés comme donnés par g1
. Ceci incluera les dons de
droits effectués par u1
ainsi que ceux effectués par les
autres membres du rôle g1
.
Si le rôle exécutant REVOKE
détient les droits indirectement
via plus d'un chemin d'appartenance, le rôle indiqué comme ayant effectué
la commande est non déterminable à l'avance. Dans de tels cas, il est
préférable d'utiliser SET ROLE
pour devenir le rôle que vous
souhaitez voir exécuter la commande REVOKE
. Ne pas faire cela
peut avoir comme résultat de supprimer des droits autres que ceux que vous
vouliez, voire même de ne rien supprimer du tout.
Enlève au groupe public le droit d'insérer des lignes dans la table
films
:
REVOKE INSERT ON films FROM PUBLIC;
Supprime tous les droits de l'utilisateur manuel
sur la
vue genres
:
REVOKE ALL PRIVILEGES ON genres FROM manuel;
Notez que ceci signifie en fait « révoque tous les droits que j'ai donné ».
Supprime l'appartenance de l'utilisateur joe
au rôle
admins
:
REVOKE admins FROM joe;
La note de compatibilité de la commande GRANT s'applique par analogie à
REVOKE
. Les mots clés RESTRICT
ou CASCADE
sont requis d'après le standard, mais
PostgreSQL utilise RESTRICT
par
défaut.