La commande GRANT accorde des permissions sur des objets de la base de données (tables, vues, procédures) à un utilisateur ou à un rôle. Elle fait partie du sous-langage SQL DCL (Data Control Language), qui gère les droits d’accès. La commande REVOKE annule les permissions accordées par GRANT.
Le principe du moindre privilège guide toute utilisation de GRANT : chaque utilisateur reçoit uniquement les droits nécessaires à sa fonction. Cette règle limite les risques de modification accidentelle ou malveillante des données.
Table des matières
Syntaxe de base
GRANT s’écrit en trois parties obligatoires : la permission accordée, l’objet cible et le destinataire.
GRANT privilege
ON schema.table
TO utilisateur;
Le mot-clé « ON » identifie la table ou la vue concernée et « TO » désigne l’utilisateur ou le rôle destinataire. WITH GRANT OPTION autorise le destinataire à transmettre ces droits à d’autres utilisateurs.
Permissions disponibles sur les tables
Les cinq permissions principales couvrent l’ensemble des opérations CRUD sur une table.
| Permission | Action autorisée |
|---|---|
SELECT | Lire les données |
INSERT | Ajouter des lignes |
UPDATE | Modifier des valeurs existantes |
DELETE | Supprimer des lignes ciblées |
TRUNCATE | Vider la table entièrement (PostgreSQL) |
Pour accorder plusieurs permissions en une seule instruction, il suffit de les lister en les séparant par des virgules.
GRANT SELECT, INSERT, UPDATE, DELETE
ON gestion.commandes
TO equipe_commerciale;
L’équipe commerciale peut désormais lire, ajouter et modifier des commandes, mais pas tronquer ni modifier la structure de la table.
Accorder des permissions sur différents objets
Tables
Les tables acceptent l’ensemble des permissions de manipulation de données. TRUNCATE et REFERENCES sont spécifiques à PostgreSQL et ne font pas partie du standard SQL de base.
GRANT SELECT, INSERT, UPDATE, DELETE
ON stock.produits
TO gestionnaire_stock;
Vues
Les vues exposent des données calculées ou filtrées depuis une ou plusieurs tables. SELECT est la permission quasi-exclusivement utilisée sur les vues, car INSERT et UPDATE nécessitent une logique inverse complexe.
GRANT SELECT
ON rapport.ventes_par_region
TO analystes;
Les analystes accèdent aux données agrégées sans jamais toucher aux tables sources.
Procédures et fonctions
EXECUTE autorise l’appel d’une procédure stockée ou d’une fonction. Cette permission permet d’encapsuler une logique métier complexe tout en la rendant accessible sans exposer les tables sous-jacentes.
GRANT EXECUTE
ON FUNCTION calcul_marge
TO comptables;
Gérer les rôles
Un rôle regroupe plusieurs permissions appliquées simultanément à plusieurs utilisateurs. Créer des rôles métier évite de répéter les mêmes autorisations pour chaque nouvel utilisateur.
CREATE ROLE crée le rôle vide, GRANT lui associe les permissions, puis les utilisateurs reçoivent le rôle par attribution directe.
-- Créer un rôle et lui attribuer des permissions
CREATE ROLE role_lecteur;
GRANT SELECT ON reporting.* TO role_lecteur;
-- Attribuer le rôle à un utilisateur
CREATE USER marie@localhost IDENTIFIED BY 'motdepasse';
GRANT role_lecteur TO marie@localhost;
Marie hérite automatiquement de toutes les permissions du rôle « role_lecteur« . Pour lui retirer l’accès, il suffit de révoquer le rôle sans modifier les permissions individuellement.
Déléguer avec WITH GRANT OPTION
Cette commande permet au destinataire de transmettre les droits reçus à d’autres utilisateurs. C’est utile pour déléguer la gestion d’accès à un responsable d’équipe sans lui donner les droits d’administrateur global.
-- Le superviseur reçoit SELECT et peut le déléguer
GRANT SELECT ON clients TO superviseur WITH GRANT OPTION;
-- Le superviseur accorde ensuite l'accès à son équipe
GRANT SELECT ON clients TO equipe_vendeurs;
Si l’administrateur révoque le droit du superviseur, les droits accordés par ce dernier sont automatiquement révoqués en cascade selon le SGBD.
Particularités selon les SGBD
MySQL
MySQL identifie les utilisateurs par la combinaison nom@hôte. Cela permet de restreindre un accès à une plage d’adresses IP spécifique, utile en environnement multi-serveurs.
GRANT SELECT ON ecom.* TO 'lecteur'@'192.168.1.%';
FLUSH PRIVILEGES;
La commande FLUSH PRIVILEGES force MySQL à recharger les tables de permissions en mémoire sinon les changements peuvent ne pas s’appliquer immédiatement.
PostgreSQL
PostgreSQL implémente les autorisations avec une granularité au niveau de la colonne individuelle. C’est la seule option quand on veut exposer uniquement certaines colonnes d’une table à un rôle.
-- Accès restreint à deux colonnes uniquement
GRANT SELECT (nom, ville) ON clients TO lecteurs_region;
Les autres colonnes (email, téléphone, etc.) restent invisibles pour ce rôle.
SQL Server
SQL Server ajoute la commande DENY qui bloque explicitement une permission, même si elle est héritée d’un rôle. C’est un mécanisme absent des autres SGBD qui ne connaissent que GRANT et REVOKE.
GRANT SELECT ON dbo.commandes TO [domaine\utilisateur];
-- Bloquer UPDATE même si un rôle accorde cette permission
DENY UPDATE ON dbo.stocks TO utilisateur_limite;
Bonnes pratiques
- Auditer régulièrement les permissions actives pour détecter les accès excessifs accumulés au fil du temps.
-- MySQL : lister les permissions d'un utilisateur
SHOW GRANTS FOR 'marie'@'localhost';
-- Standard SQL : permissions sur les tables
SELECT grantee, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'marie';
- Utiliser des rôles métier plutôt que d’assigner des permissions directement aux utilisateurs — cela simplifie la gestion lors des changements d’équipe.
- Éviter de donner trop de permissions en production : accorder uniquement les permissions nécessaires, même pour les comptes d’application.
Cas pratique : e-commerce
Un site e-commerce définit des rôles distincts selon les responsabilités de chaque équipe.
-- Rôle lecture seule pour les analystes
CREATE ROLE data_lecteur;
GRANT SELECT ON analytics.* TO data_lecteur;
-- Rôle opérationnel pour les préparateurs de commandes
CREATE ROLE preparateur_role;
GRANT SELECT, UPDATE ON stocks TO preparateur_role;
GRANT SELECT ON commandes_en_preparation TO preparateur_role;
-- Attribution des rôles aux utilisateurs
GRANT data_lecteur TO analyste_julie;
GRANT preparateur_role TO preparateur_marc;
Chaque utilisateur accède uniquement aux tables nécessaires à sa fonction, sans visibilité sur les données des autres équipes.
Erreurs courantes
Erreur 1 : accorder tous les privilèges sans restriction
GRANT ALL donne à l’utilisateur le contrôle total de la base, y compris la possibilité de modifier ou supprimer des tables. En production, cette permission ne doit jamais être accordée à un compte applicatif.
-- ❌ Trop permissif
GRANT ALL PRIVILEGES ON *.* TO 'app_user'@'localhost';
-- ✅ Limiter aux permissions nécessaires
GRANT SELECT, INSERT, UPDATE ON ecom.commandes TO 'app_user'@'localhost';
Avec la version correcte, app_user ne peut ni supprimer de tables, ni modifier le schéma, ni accéder aux autres bases.
Erreur 2 : oublier de réinitialiser les privilèges en MySQL
En MySQL, les permissions modifiées via GRANT sur les tables système ne sont pas toujours rechargées en mémoire immédiatement. Sans rénitialisation des privilèges, le nouvel accès peut ne pas fonctionner avant un redémarrage du serveur.
-- ❌ Sans rechargement
GRANT SELECT ON ecom.* TO 'lecteur'@'localhost';
-- ✅ Avec rechargement immédiat
GRANT SELECT ON ecom.* TO 'lecteur'@'localhost';
FLUSH PRIVILEGES;
Après la réinitialisation, les droits s’appliquent immédiatement sans redémarrer MySQL.
Erreur 3 : utiliser WITH GRANT OPTION sans contrôle
WITH GRANT OPTION permet à l’utilisateur de redistribuer ses droits à n’importe qui d’autre. Accordée sans restriction, cette option peut créer une chaîne de permissions non maîtrisée.
-- ❌ Accordé à un utilisateur standard
GRANT SELECT ON clients TO utilisateur WITH GRANT OPTION;
-- ✅ Réservé à un responsable identifié
GRANT SELECT ON clients TO superviseur_equipe WITH GRANT OPTION;
En limitant l’octroi des permissions aux responsables, l’administrateur garde le contrôle de la chaîne de délégation.
Sources: MySql , Postgresql, SQL Server