- Partie 3 -
1
Gestion des exceptions
2
Manipulation des exceptions en PL/SQL
• Le traitement des exceptions PL/SQL est un mécanisme pour
manipuler les erreurs rencontrées lors de l’exécution.
• L'utilisation de ce mécanisme permet à l'exécution de continuer
si l'erreur n'est pas suffisamment importante pour produire
la terminaison de la procédure.
• La décision de permettre à une procédure de continuer après
une condition d'erreur est une décision que le développeur doit
faire en fonction des erreurs possibles.
3
Manipulation des exceptions en PL/SQL
•Une exception non traitée, provoque l’échec du bloc PL/SQL
•Pour se protéger contre ces situations, il est possible de
gérer ces exceptions:
– La gestion d’une exception consiste à prévoir un traitement
approprié qui absorbe ou résout l’erreur.
•L’endroit de ce traitement est la section EXCEPTION
4
Manipulation des exceptions en PL/SQL
• En cas d’une exception rencontrée dans la section
exécutable d’un bloc, le contrôle passe immédiatement
à la section EXCEPTION du même bloc :
DECLARE
BEGIN
Erreur
...
...
EXECPTION
END; 5
Capture des exceptions
Syntaxe :
…
EXCEPTION
WHEN exception1 THEN
énoncé1;
énoncé2;
…….
[WHEN exception2 [OR exception3 …] THEN
énoncé3;
énoncé4;
…….]
[WHEN OTHERS THEN
énoncé5;
énoncé6;
…….]
6
Exemple
DECLARE
V_nom Chercheur.Cnom%TYPE;
BEGIN
SELECT nom
INTO V_nom
FROM Chercheur
…
DBMS_OUTPUT.PUT_LINE (‘Nom Chercheur : ’|| V_nom);
Exception
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE (‘Plusieurs chercheurs Trouvés.’);
END;
7
Exceptions prédéfinies (dans ORACLE)
– Elles sont prédéfinies par Oracle
– Elles possèdent des noms significatifs
– Elles sont automatiquement provoquées
– Les exceptions les plus courantes sont les suivantes :
• Exception NO_DATA_FOUND (ORA-01403)
• Exception TOO_MANY_ROWS (ORA-01422)
• Exception DUP_VAL_ON_INDEX (ORA-00001)
• Exception VALUE_ERROR (ORA-06502)
• Exception ZERO_DIVIDE (ORA-01476)
• Exception INVALID_CURSOR (ORA-01722)
8
• Exception TOO_MANY_ROWS (ORA-01422)
– Condition de provocation : lorsqu ’ un curseur implicite
d’interrogation identifie plus d’une seule ligne à retourner
– Exemple : plusieurs étudiants ayant la même filière
DECLARE
V_NomETUD ETUDIANT.NomETUD%TYPE;
BEGIN
SELECT NomETUD
INTO V_NomETUD
FROM ETUDIANT WHERE filière = ‘Informatique’;
EXECPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE (‘Plusieurs étudiants trouvés.’);
…
END;
9
• Exception NO_DATA_FOUND (ORA-01403)
– Condition de provocation : lorsqu ’ un curseur implicite
d’interrogation ne retourne aucune ligne
– Exemple : cas de recherche d’un étudiant inexistant
DECLARE
ETUDIANT_REC ETUDIANT%ROWTYPE;
…
BEGIN
SELECT * INTO ETUDIANT_REC
FROM ETUDIANT WHERE NumETUD= -1;
EXECPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE (‘Etudiant Inexistant’);
…
END;
– Remarque : L ’ absence d ’ un gestionnaire pour l ’ exception
NO_DATA_FOUND entraîne une sortie du bloc avec échec 10
• Exception DUP_VAL_ON_INDEX (ORA-00001)
– Condition de provocation : lorsqu’une commande SQL tente
d’insérer une valeur dupliquée dans une colonne définie avec un
PRIMARY KEY …
– Exemple : cas d’insertion avec duplication de clé primaire
BEGIN
INSERT INTO Etudiant (NumETUD, …)
VALUES (10, ‘Dupont’, ‘Informatique’);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE (‘Insertion rejetée :NumETUD existe déjà.’);
END;
11
• Exception VALUE_ERROR (ORA-06502)
– Condition de provocation : en cas de troncature ou d’erreur
de conversion
– Exemple : Affectation générant une troncature
DECLARE
V_message VARCHAR2 (10);
BEGIN
V_message :=‘Chaîne trop longue’;
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE (‘Erreur de troncature’);
END;
12
• Exception ZERO_DIVIDE (ORA-01476)
– Condition de provocation : tentative de division par ZERO
– Exemple
DECLARE
V_nombre1 int :=10;
V_nombre2 int :=5;
V_resultat number (5,3);
BEGIN
V_resultat := 100/(V_nombre1 -2* V_nombre2);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE (‘Exception ZERO_DIVIDE’);
END;
13
• Exception INVALID_CURSOR (ORA-01722)
– Condition de provocation : au moment ou un curseur fermé
est référencé dans une opération de lecture (FETCH), de
fermeture (CLOSE) ou via des attributs (%FOUND,
%NOTFOUND, %ROWCOUNT)
• Exceptions génériques OTHERS
— Condition de provocation : toute exception non gérée
— WHEN OTHERS doit être la dernière
14
Les procédures stockées
15
Les procédures stockées
Les procédures stockées sont des blocs PL/SQL qui possèdent des noms
Elles consistent à stocker le code du bloc PL/SQL compilé dans la
base de données ( commande : CREATE PROCEDURE … ).
Elles peuvent être appelées à partir d’un autre bloc PL/SQL …
16
Les procédures stockées
Syntaxe:
CREATE PROCEDURE Nom_Procédure (Param1, … , Paramn)
IS
[Déclarations des variables locales]
BEGIN
…
EXCEPTION
…
END ;
/
« Procedure Created » La procédure est correcte
Ou
« Procedure Created with compilation errors »
SHOW ERRORS; 17
Les procédures stockées
CREATE PROCEDURE Nom_Procédure (Param1,…,Paramn)
IS
[Déclarations des variables locales]
BEGIN
…
EXCEPTION
…
END ;
/
Exemple:
18
Les procédures stockées
CREATE PROCEDURE Nom_Procédure (Param1…, Parami , …)
IS
[Déclarations des variables locales]
BEGIN
…
EXCEPTION
…
END ;
/
Parami suit la syntaxe : Nom_du_Paramètre [IN | OUT | IN OUT] Type
Où :
IN : Paramètre d’entrée
OUT : Paramètre de sortie
IN OUT : Paramètre d’entrée/Sortie
Par défaut le paramètre est IN
19
Appel des procédures stockées
Une procédure stockée est appelée par les autres applications soit:
• en utilisant son nom dans un autre bloc PL/SQL (ou dans une autre
procédure).
• par EXECUTE dans SQL*Plus.
· Dans un bloc PL/SQL :
BEGIN
…
Nom_Procédure (valeur_Param1,…, valeur_Paramn) ;
END ;
· Dans SQL*PLUS :
EXECUTE Nom_Procédure (valeur_Param1,…, valeur_Paramn) ;
20
Suppression des procédures stockées
• Comme tout objet manipulé par Oracle, les procédures stockées
peuvent être supprimées si nécessaire.
• Cette suppression est assurée par la commande suivante :
DROP PROCEDURE nom_procédure;
21
Conventions de nommage
PL/SQL
22
Lisibilité des programmes PLSQL (Convention de nommage)
• Pour une meilleur lisibilité des programmes, il est
recommandé de préfixer les identificateurs selon les
conventions suivantes :
Identificateurs Préfixe Exemple
Variables V_ V_Salaire
Curseurs C_ C_Etudiants
Paramètre P_ P_Immat
23
Gestion des utilisateurs et de
leurs droits
(Chapitre 7)
Gestion des utilisateurs et de leurs droits
Pour la gestion de la sécurité, Oracle permet :
– de définir les utilisateurs qui peuvent se connecter à la BD
– de définir les droits de chaque utilisateur à l’intérieur de la BD
– D’imposer une politique de gestion de mots de passe,
– …
25
Modes d’identification des utilisateurs
Un utilisateur peut être identifié par Oracle
ou par le système d’exploitation:
a/ Identification par Oracle
1. l’utilisateur se connecte à la base en utilisant un nom et un Mot de Passe (MdP)
2. Oracle vérifie le nom et le MdP
SQL> CONNECT nom/MdP
b/ Identification par le le Système d’Exploitation (SE):
1. l’utilisateur se connecte à la base sans saisir ni de nom ni de MdP.
2. Oracle ne vérifie pas le MdP, mais contrôle simplement que le nom de
l’utilisateur au niveau du SE correspond à un nom d’utilisateur dans la
BD. L’identification initiale a été réalisée par le SE.
SQL> CONNECT /
26
Créer des utilisateurs
Création d’un utilisateur:
L’ordre SQL CREATE USER permet de créer un nouvel utilisateur:
Syntaxe:
CREATE USER nom IDENTIFIED { BY mot_de_passe | EXTERNALLY }
[ PASSWORD EXPIRE ]
[ ACCOUNT { LOCK | UNLOCK } ]
…;
IDENTIFIED : indique si l’utilisateur est identifié par le SE (EXTERNALLY ) ou
par Oracle (BY mot_de_passe)
PASSWORD EXPIRE: permet de forcer une modification du mot de passe lors de la
première connexion
ACCOUNT: peut prendre deux valeurs:
1. LOCK: le compte est verrouillé et la connexion est interdide,
2. UNLOCK: le compte n’est pas verrouillé et la connexion est autorisée
28
Création d’un utilisateur:
L’ordre SQL CREATE USER permet de créer un nouvel utilisateur:
Syntaxe:
CREATE USER nom IDENTIFIED { BY mot_de_passe | EXTERNALLY }
[ PASSWORD EXPIRE ]
[ ACCOUNT { LOCK | UNLOCK } ]
…;
- Exemple de création d’un utilisateur identifié par Oracle (mot_de_passe =tempo):
CREATE USER Simon IDENTIFIED BY tempo
PASSWORD EXPIRE;
ACCOUNT LOCK;
29
modification d’un utilisateur
Syntaxe:
ALTER USER nom
[IDENTIFIED { BY mdp | EXTERNALLY }]
[PASSWORD EXPIRE ]
[ACCOUNT {LOCK | UNLOCK} ]
…
;
Exemples :
l. Modification du mot de passe d’un utilisateur: ALTER USER Simon
IDENTIFIED BY nouveau_mot_de_passe;
2. Verrouillage d’un compte: ALTER USER Simon ACCOUNT LOCK;
3. Déverrouillage d’un compte: ALTER USER Simon ACCOUNT UNLOCK;
30
Suppression d’un utilisateur
Syntaxe:
DROP USER nom [CASCADE];
Exemple :
DROP USER Simon CASCADE;
• Si l’utilisateur possède des tables, l’option CASCADE doit
être présente pour forcer la suppression préalable de ses tables
• Si l’utilisateur possède des tables et l’option CASCADE n’est
pas présente : Erreur
• Un utilisateur connecté ne peut pas être supprimé
31
Gérer les droits des utilisateurs
Droits (privilèges) des
utilisateurs
• Lorsqu'un utilisateur est créé avec l'instruction :
CREATE USER …
il ne dispose encore d'aucun droit
car aucun privilège ne lui a encore été
assigné.
• Il ne peut même pas se connecter à la base !
33
Utilisateur Oracle
34
Gestion des Privilège système
Privilège système:
• Un Privilège système est le droit d’exécuter un ordre SQL en général
• Chaque ordre SQL a au moins un privilège système associé qui porte
le même nom que l’ordre SQL
• Par exemple l’ordre CREATE TABLE possède un privilège système
associé CREATE TABLE qui donne le droit de créer une table dans
son propre schéma
• Exemples de privilèges système: CREATE TABLE, DROP TABLE,
CREATE USER, ALTER USER, DROP USER, …
1. attribution d’un privilège système à un utilisateur:
Syntaxe:
GRANT nom_privilège [, …]
TO {nom_utilisateur | PUBLIC} [,…]
[WITH ADMIN OPTION]
Exemple : GRANT CREATE TABLE TO Paul;
Le privilège peut être attribué à un utilisateur ou à
tous les utilisateurs (PUBLIC):
Exemple : GRANT CREATE TABLE TO PUBLIC;
Le privilège attribué est immédiatement actif.
1. attribution d’un privilège système à un utilisateur:
Syntaxe:
GRANT nom_privilège [,…]
TO {nom_utilisateur | PUBLIC} [,…]
[WITH ADMIN OPTION]
La clause WITH ADMIN OPTION donne au bénéficiaire le
droit de retransmettre le privilège système à d’autres utilisateurs.
2. Révocation d’un privilège système à un utilisateur:
Syntaxe:
REVOKE nom_privilège [,…]
FROM {nom_utilisateur | PUBLIC} [,…]
Exemple : REVOKE CREATE TABLE FROM Paul;
Le privilège est immédiatement révoqué et ne peut plus être
exercé.
2. Révocation d’un privilège système
Si vous avez attribué un privilège avec l’option WITH ADMIN OPTION
et que vous souhaitiez enlever cette possibilité de transmission:
– il faut révoquer le privilège et l’attribuer de nouveau sans l’option.
Tous les privilèges système peuvent être révoqués d’un seul
coup avec le mot clé ALL PRIVILEGES :
REVOKE ALL PRIVILEGES FROM ...
40
2. Révocation d’un privilège système (suite)
L’ordre REVOKE permet de révoquer uniquement les privilèges qu’un
utilisateur a reçu en direct
(non les privilèges qu’il a implicitement via PUBLIC):
•Si un privilège a été attribué à un utilisateur et à PUBLIC:
– la révocation de l’utilisateur est sans effet sur la possibilité pour
l’utilisateur de continuer à exercer le privilège :
– car il le possède toujours via PUBLIC.
41
Gestion des Privilège objet
Privilège objet
• Définition : Un Privilège objet est le droit d’accéder à un Objet (Table,
Vue, Séquence, …) d’un autre utilisateur.
• Par défaut, seul le propriétaire d’un objet a le droit d’y accéder
• Pou qu’un autre utilisateur puisse accéder à l’objet, le propriétaire de
l’objet doit lui donner un privilège objet
43
Privilège objet
• Définition : Un Privilège objet est le droit d’accéder à un Objet (Table,
Vue, Séquence, …) d’un autre utilisateur.
• Par défaut, seul le propriétaire d’un objet a le droit d’y accéder
• Pou qu’un autre utilisateur puisse accéder à l’objet, le propriétaire de
l’objet doit lui donner un privilège objet
• Les principaux privilèges objets sont les suivants :
Privilège Table Programme PL/SQL
SELECT X
INSERT X
UPDATE X
DELETE X
EXECUTE X
44
1. attribution d’un privilège objet à un utilisateur :
L’ordre SQL GRANT permet d’attribuer un privilège objet:
GRANT {liste_privilèges | ALL} ON nom_objet
TO { nom_utilisateur | PUBLIC }
[ WITH GRANT OPTION ]
avec liste_privilèges peut être égale à:
– SELECT : lecture de toutes les colonnes d’une table ou d’une vue.
– INSERT[liste_colonne] : insertion dans une table ou dans une vue,
éventuellement limitée à certaines colonnes.
– UPDATE[liste_colonne] : mise à jour dans une table ou dans une vue,
éventuellement limitée à certaines colonnes.
– DELETE : suppression dans une table ou dans une vue.
Exemple:
GRANT SELECT, UPDATE ON Table_1 TO Simon
45
1. attribution d’un privilège objet à un utilisateur :
GRANT {liste_privilèges | ALL} ON [nom_schéma.]nom_objet
TO { nom_utilisateur | PUBLIC} [WITH GRANT OPTION ]
La clause WITH GRANT OPTION donne au bénéficiaire
le droit de transmettre le privilège objet.
Exemple:
D’abord, le propriétaire de la table «Table_1» exécute:
GRANT SELECT, UPDATE ON Table_1
TO User_1 WITH GRANT OPTION;
Ensuite, l’utilisateur «User_1» peut exécuter:
GRANT SELECT ON Table_1 TO User_2
46
3.2.1 attribution d’un privilège objet à un utilisateur :
Pour attribuer un privilège objet, il faut :
• être propriétaire de l’objet
• ou avoir reçu le privilège avec la clause WITH GRANT OPTION ;
• ou avoir reçu le privilège système ANY OBJECT PRIVILEGE.
47
2. Retirer un privilège objet à un utilisateur:
L’ordre SQL REVOKE permet de révoquer un privilège objet.
Syntaxe:
REVOKE {ALL | liste_privilèges} ON
[nom_schéma.]nom_objet
FROM {nom_utilisateur |PUBLIC}
Exemple :
REVOKE SELECT ON Table_1 FROM User_2 ;
REVOKE SELECT, UPDATE ON Table_1 FROM User_1;
REVOKE DELETE ON Table_1 FROM PUBLIC
Le privilège est immédiatement enlevé et ne peut plus être exercé.
48
2. Retirer un privilège objet à un utilisateur:
Syntaxe:
REVOKE {ALL | liste_privilèges} ON
[nom_schéma.]nom_objet
FROM {nom_utilisateur |PUBLIC}
• Si vous avez attribué un privilège avec l’option WITH GRANT OPTION
• et que vous souhaitiez enlever cette possibilité de transmission,
• il faut révoquer le privilège et l’attribuer de nouveau sans
l’option.
Gestion des Rôles
Notion de Rôle
• Définition: Un rôle est un regroupement nommé de
privilèges (système et/ou objet) qui peut être attribué à un
utilisateur.
• Tous les privilèges regroupés dans le rôle sont alors
simultanément attribués à l’utilisateur
51
Notion de Rôle
• Définition: Un rôle est un regroupement nommé de
privilèges (système et/ou objet) qui peut être attribué à un
utilisateur.
• Tous les privilèges regroupés dans le rôle sont alors
simultanément attribués à l’utilisateur
• Les rôles permettent de simplifier la gestion des droits.
• Les principales caractéristiques des rôles sont les suivantes :
– Un rôle peut être attribué à un autre rôle.
– Un utilisateur peut avoir plusieurs rôles.
– Un rôle n’appartient à personne.
52
Les étapes de gestion des Rôles
• La mise en oeuvre des rôles s’effectue en trois étapes :
1. création du rôle ;
2. attribution des privilèges (système et objet) au rôle ;
3. attribution du rôle aux utilisateurs.
53
Le principe d’un rôle (ROLE) est de créer un groupement
nommé de privilèges. Celui-ci peut être accordé à d’autres
utilisateurs.
Utilisateur1 Privilège 1
Rôle A
Privilège 2
Utilisateur2
Rôle B
Privilège 3
Utilisateur3
Rôle C Privilège 4
Utilisateur4
54
:
Les principaux rôles, prédéfinis par Oracle et
attribués aux utilisateurs SYSTEM et SYS, sont :
Rôle Privilège système
CONNECT CREATE SESSION
RESOURCE CREATE TABLE, CREATE TRIGGER,
CREATE SEQUENCE,
CREATE PROCEDURE, …
DBA Tous les privilèges
55
1. Création d’un rôle:
L’ordre SQL CREATE ROLE permet de créer un rôle avec la Syntaxe:
CREATE ROLE nom
[ IDENTIFIED { BY mot_de_passe | EXTERNALLY}
| NOT IDENTIFIED ];
Les options sont :
IDENTIFIED BY mot_de_passe :Indique qu’un mot de passe est nécessaire pour
activer le rôle.
IDENTIFIED EXTERNALLY: Indique qu’une identification externe est
nécessaire pour activer le rôle.
NOT IDENTIFIED : Indique qu’aucune identification n’est nécessaire pour
activer le rôle. C’est la valeur par défaut.
56
1. Création d’un rôle:
L’ordre SQL CREATE ROLE permet de créer un rôle avec la
Syntaxe:
CREATE ROLE nom
[ IDENTIFIED { BY mot_de_passe | EXTERNALLY}
| NOT IDENTIFIED ];
Exemple : CREATE ROLE mailing;
Pour créer un rôle, il faut avoir le privilège système:
CREATE ROLE
57
Attribution (ou Ajout) d’un privilège à un rôle:
• L’ordre SQL GRANT permet d’attribuer des privilèges système
ou des privilèges objet à un rôle.
• Syntaxe pour les privilèges système:
GRANT nom_privilège [,...]
TO nom_rôle [,...]
[ WITH ADMIN OPTION ] ;
Exemple : GRANT CREATE SESSION, CREATE TABLE TO mailing;
58
Attribution (ou Ajout) d’un privilège à un rôle:
• L’ordre SQL GRANT permet d’attribuer des privilèges système ou
des privilèges objet à un rôle.
• Syntaxe pour les privilèges objet:
GRANT { nom_privilège[(liste_colonnes)] [,...] | ALL}
ON [nom_schéma.]nom_objet
TO nom_rôle [,...] ;
Exemple :
GRANT SELECT, INSERT ON Table_1 TO mailing;
59
Révocation (retrait) d’un privilège à un rôle
• L’ordre SQL REVOKE permet de révoquer des privilèges
système ou des privilèges objet à un rôle.
• Syntaxe pour les privilèges système
REVOKE nom_privilège [ ,...]
FROM nom_rôle [,...] ;
• Exemples :
–REVOKE CREATE TABLE FROM mailing;
60
Révocation (retrait) d’un privilège à un rôle
• L’ordre SQL REVOKE permet de révoquer des privilèges
système ou des privilèges objet à un rôle.
• Syntaxe pour les privilèges objet
REVOKE { nom_privilège [,...] | ALL }
ON nom_objet
FROM nom_rôle [,...] ;
• Exemples :
–REVOKE UPDATE ON Table_1 FROM mailing;
61
Attribution d’un rôle
à un utilisateur ou à un rôle
• L’ordre SQL GRANT permet d’attribuer un rôle à un
utilisateur ou à un rôle.
• Syntaxe:
GRANT nom_rôle1
TO { nom_utilisateur | nom_rôle2 }
[ WITH ADMIN OPTION ] ;
• Exemple : GRANT mailing TO simon;
Le rôle attribué n’est pas immédiatement actif
si l’utilisateur est déjà connecté.
62
Activation ou désactivation d’un rôle
• L’ordre SQL SET ROLE permet d’activer ou de désactiver un rôle.
• Syntaxe:
SET ROLE { nom_rôle [ IDENTIFIED BY mot_de_passe ] [,...]
| ALL [ EXCEPT nom_rôle [,...] ] | NONE
};
• Exemple -> L’utilisateur connecté active le rôle MAILING :
SET ROLE mailing;
63
Activation ou désactivation d’un rôle
• L’ordre SQL SET ROLE permet d’activer ou de désactiver un rôle.
• Syntaxe:
SET ROLE { nom_rôle [ IDENTIFIED BY mot_de_passe ] [,...]
| ALL [ EXCEPT nom_rôle [,...] ] | NONE
};
• Exemple -> L’utilisateur connecté active le rôle MAILING :
SET ROLE mailing;
• Les options sont :
–IDENTIFIED BY: Donne le mot de passe qui permet d’activer le
rôle.
–ALL: Tous les rôles attribués à l’utilisateur sont activés. La clause
EXCEPT permet d’en enlever certains.
–NONE : Aucun des rôles attribués à l’utilisateur n’est activé
(désactive donc tous les rôles).
64
Trouver des informations sur les Rôles
Les colonnes intéressantes de la vue USER_ROLE_PRIVS:
•GRANTEE : Nom de l’utilisateur ou du rôle qui a reçu le rôle.
•GRANTED_ROLE : Nom du rôle reçu.
•ADMIN_OPTION : Rôle reçu avec la clause WITH ADMIN OPTION (YES ou NO)
65
Rappel des Rôles prédéfinis
Oracle propose en standard un grand nombre de rôle prédéfinis,
parmi lesquels :
•CONNECT: Autorise la connexion (contient uniquement le
privilège système CREATE SESSION).
•RESOURCE: Permet la création des principaux objets (table...).
•DBA: Donne tous les privilèges système avec l’option WITH
ADMIN OPTION.
66
Révocation d’un rôle à un
utilisateur ou à un rôle
• L’ordre SQL REVOKE permet de révoquer (enlever) un
rôle à un utilisateur ou à un rôle.
• Syntaxe
REVOKE nom_rôle [,...]
FROM { nom_utilisateur | PUBLIC | nom_rôle } [,...] ;
• Exemple : REVOKE mailing FROM simon;
67