Premier niveau de l’administration des SGBD : utilisateurs, rôles, droits

utilisateurs : classification

Le DBA (DataBase Administrator). Il en existe au moins un. Une petite base peut n’avoir qu’un seul administrateur. Une base importante peut en regrouper plusieurs qui se partagent les tâches suivantes :


● L’administrateur réseaux (qui peut être le DBA) se charge de la configuration des couches clients pour les accès distants.

● Les développeurs qui conçoivent et mettent à jour la base. Ils peuvent aussi agir sur leurs objets (création et modification des tables, index, séquences, etc.). Ils transmettent au DBA leurs demandes spécifiques (stockage, optimisation, sécurité).

● Les administrateurs d’applications qui gèrent les données manipulées par l’application ou les applications. Pour les petites et les moyennes bases, le DBA joue ce rôle.

● Les utilisateurs qui se connectent et interagissent avec la base à travers les applications ou à l’aide d’outils (interrogations pour la génération de rapports, ajouts, modifications ou suppressions d’enregistrements).
Tous seront des utilisateurs (au sens Oracle) avec des privilèges différents.

mysql : structure

SHOW DATABASES;

créer un (des) utilisateurs

Depuis sur l’IUT la machine utilisée est serveurmysql2 :

Se connecter en tant que root :

-- sur un poste de l'IUT
mysql --user=root --host=serveurmysql2 --database=mysql --password=secret
-- avec VPN à l'IUT
mysql --user=root --host=serveurmysql2.iut-bm.univ-fcomte.fr --database=mysql --password=secret

-- sur une machine personnelle
sudo mysql -u root -p

Créer des utilisateurs préfixés de votre login de l’iut


L’hôte est l’adresse à partir de laquelle l’utilisateur va se connecter.

ip address
## recherche adresse IP sur un portable avec le VPN
## inet 10.248.2.112/32

login@912e002-01:~/Desktop$ hostname -i
172.20.176.%


ping -a serveurmysql2.iut-bm.univ-fcomte.fr

-- remplacer l'adresse IP par localhost sur vos machines personnelles

CREATE USER 'login'@'%' IDENTIFIED BY 'secret';

CREATE USER 'login_user2'@'172.20%' IDENTIFIED BY 'secret';
CREATE USER 'login_user3'@'10.248%' IDENTIFIED BY 'secret';
-- ou sur un portable 

CREATE USER 'login_user4'@'serveurmysql2' IDENTIFIED BY 'secret';
CREATE USER 'login_user41'@'pc-amillet' IDENTIFIED BY 'secret';
CREATE USER login_user5 IDENTIFIED BY 'secret';
CREATE USER login_user6;
CREATE USER 'login_user7'@'%login%' IDENTIFIED BY 'secret';

CREATE USER login_admin IDENTIFIED BY 'secret';

CREATE USER 'login_user8'@'%912e007-0%' IDENTIFIED BY 'secret';
CREATE USER 'login_user9'@'912e007-03.iut-bm.univ-fcomte.fr' IDENTIFIED BY 'secret';   
                  -- remplacer 007-03 par le numéro de votre poste

Tester les connexions dans un terminal

mysql  --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login
mysql  --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login_user2
mysql  --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login_user3
mysql  --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login_user4
mysql  --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login_user41
mysql  --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login_user5
mysql                    --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login_user6

mysql  --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login_user7
mysql  --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login_user8
mysql  --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login_user9
mysql  --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr  --user=login_admin

voir

mysql --password=secret --host=serveurmysql2  --user=login  -- o
mysql --password=secret --host=serveurmysql2  --user=login_user2  -- n
mysql --password=secret --host=serveurmysql2  --user=login_user3  -- o 
mysql --user=login_user4  --password=secret --host=serveurmysql2  -- n
mysql --user=login_user5  --password=secret --host=serveurmysql2  -- o
mysql --user=login_user6                    --host=serveurmysql2  -- n
 
mysql --user=login_user7 --password=secret --host=serveurmysql2  -- n
mysql --user=login_user8  --password=secret --host=serveurmysql2  -- n
mysql --user=login_user9  --password=secret --host=serveurmysql2  -- n
mysql --user=login_admin  --password=secret --host=serveurmysql2  -- o

on peut l’adresse ip qui est refusé

Liste des utilisateurs

SELECT User,Host FROM mysql.user ORDER BY User;

SHOW CREATE USER 'login'@'%';

SELECT User,Host FROM mysql.user WHERE User LIKE '%login%';

Remarque : en remplaçant 'login'@'hostclient' par 'login'@'%'


lien

information sur l’utilisateur

mysql> SELECT user() ;

Le résultat peut être : moi@localhost ou moi@maMachine. C’est le nom de l’utilisateur et son hôte (sa machine)

mysql> SELECT current_user() ;

Le current_user est un profil d’utilisateur et pas l’utilisateur avec son nom et sa machine. On peut par exemple avoir un profil de connexion correspondant à :

• un nom d’utilisateur pouvant se connecter de n’importe quelle machine : moi@’%’
• un nom d’utilisateur pouvant se connecter de la machine du serveur : moi@localhost
• un nom d’utilisateur pouvant se connecter de sa machine uniquement : moi@maMachine
• n’importe quel utilisateur se connectant à partir d’une machine particulière : ‘%’@cetteMachine
• un nom d’utilisateur pouvant se connecter de sa machine uniquement : moi@maMachine

afficher la liste des utilisateurs

DESCRIBE user;


SELECT Host,User
,Select_priv
-- ,max_connections
-- ,max_user_connections
, plugin,authentication_string
, password_expired

FROM user
-- WHERE User LIKE '%login%'
;

Renommer un utilisateur

SELECT User,Host FROM mysql.user  WHERE User LIKE '%login%';

RENAME USER 'login_user4' TO 'login_user4'@'%';         -- NON
RENAME USER 'login_user4'@'serveurmysql2' TO 'login_user4'@'%';

SELECT User,Host FROM mysql.user  WHERE User LIKE '%login%';

Supprimer un utilisateur

DROP USER 'login_user4';
DROP USER 'login_user3'@'10.248%';
CREATE USER 'login_user3'@'%' IDENTIFIED BY 'secret';

SELECT User,Host FROM mysql.user;
SELECT User,Host FROM mysql.user  WHERE User LIKE '%login%';

Modifier un mot de passe


L’instruction dépend de la version de mysql (mysql --version dans un terminal)

Commande MySQL MariaDB Statut Notes
ALTER USER 'login' IDENTIFIED BY 'secret'; ≥ 5.7.6 ≥ 10.2 ✅ Conseillé Syntaxe standard SQL, à privilégier dans tous les cas. Pas de FLUSH PRIVILEGES nécessaire.
ALTER USER 'login' IDENTIFIED WITH 'mysql_native_password' BY 'secret'; 8.x ❌ Non ℹ️ Contexte Utile sur MySQL 8 pour forcer le plugin legacy (compatibilité clients anciens).
ALTER USER 'login' IDENTIFIED VIA mysql_native_password USING PASSWORD('secret'); ❌ Non ≥ 10.2 ℹ️ MariaDB only Syntaxe propre à MariaDB (VIA au lieu de WITH).
ALTER USER 'login' IDENTIFIED WITH plugin_authentification BY 'secret'; ❌ Non ❌ Non ❌ Invalide plugin_authentification n’est pas un vrai nom de plugin. À supprimer du cours.
SET PASSWORD FOR 'login' = PASSWORD('secret'); ≤ 5.7.5 Legacy ⚠️ Déconseillé Fonction PASSWORD() supprimée sur MySQL 8. À réserver aux très vieilles versions.
UPDATE user SET Password=PASSWORD('secret') WHERE User='login'; ≤ 5.7.5 ❌ Non ❌ Déprécié Colonne Password supprimée à partir de 5.7.6. Ne fonctionne plus.
UPDATE user SET authentication_string=PASSWORD('secret') WHERE User='login'; FLUSH PRIVILEGES; 5.7.6 – 7.x ❌ Non ❌ Déconseillé Non portable, non conforme aux autres SGBDR. FLUSH PRIVILEGES requis manuellement.

Rappel : FLUSH PRIVILEGES est inutile après ALTER USER ou GRANT (rechargement automatique). Il n’est nécessaire qu’après un UPDATE direct sur les tables système.

Donc on retiendra ALTER USER 'login' IDENTIFIED BY 'secret';

Pour information :

PostgreSQL

CREATE USER user_name WITH ENCRYPTED PASSWORD 'mypassword';
ALTER USER user_name WITH PASSWORD 'new_password';

Oracle

CREATE USER username IDENTIFIED BY password;
ALTER USER user_name IDENTIFIED BY new_password;

SQL Server

CREATE LOGIN user_name WITH PASSWORD = 'mypassword';
ALTER LOGIN user_name WITH PASSWORD = 'new_password';

Base de données

CREATE DATABASE BDD_login;
CREATE DATABASE BDD_login2
    DEFAULT CHARACTER SET utf8
    COLLATE utf8_bin;
CREATE DATABASE BDD_login3;
CREATE DATABASE BDD_login4;
SELECT * FROM db;   -- sur mysql de oracle (vide sur mariadb)


-- voir les droits par base de données
SELECT * FROM information_schema.SCHEMA_PRIVILEGES;

-- ou plus lisible
SHOW GRANTS FOR 'login'@'%';


-- 2. on vérifie (vide pour l'instant)
SELECT * FROM mysql.db;

-- 3. on accorde des droits
GRANT ALL PRIVILEGES ON BDD_login.* TO 'login'@'%';

-- 4. on vérifie à nouveau (la ligne apparaît)
SELECT * FROM mysql.db;

les schémas (BDD sur mysql)

SELECT SCHEMA_NAME , default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA;

SELECT SCHEMA_NAME , default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME LIKE '%login%';

les droits

SELECT * FROM db;   -- sur mysql de oracle (vide sur mariadb)


-- voir les droits par base de données
SELECT * FROM information_schema.SCHEMA_PRIVILEGES;

-- ou plus lisible
SHOW GRANTS FOR 'login'@'%';


-- 2. on vérifie (vide pour l'instant)
SELECT * FROM mysql.db;

-- 3. on accorde des droits
GRANT ALL PRIVILEGES ON BDD_login.* TO 'login'@'%';

-- 4. on vérifie à nouveau (la ligne apparaît)
SELECT * FROM mysql.db;

supprimer une base de données

DROP DATABASE BDD_login4;
USE BDD_login;

https://zestedesavoir.com/tutoriels/730/administrez-vos-bases-de-donnees-avec-mysql/954_gestion-des-utilisateurs-et-configuration-du-serveur/3962_gestion-des-utilisateurs/

-- compte login  (remplacer login et motdepasse) dans tout le script
-- mysql --user=login --password=motdepasse --host=localhost  --database=BDD_login

CREATE DATABASE BDD_login;
CREATE USER 'login' IDENTIFIED BY  'motdepasse';

GRANT ALL PRIVILEGES ON  BDD_login.* TO 'login'@'%';
FLUSH PRIVILEGES;

-- pb avec LOAD DATA
-- GRANT ALL PRIVILEGES ON  BDD_login.* TO 'login'@'%';

priviléges (droits)

Consulter les droits d’un utilisateur : ➢ Pour n’importe quel utilisateur :

SHOW GRANTS [FOR user];

➢ Pour soi-même :

mysql> SHOW GRANTS;

➢ Droit d’USAGE Quand on crée un utilisateur, il n’a qu’un seul droit : le droit d’usage. Ca lui permet de se connecter mais il ne peut rien faire d’autre !

mysql> SHOW GRANTS;
+------------------------------------------+
| Grants for nouvelUtilisateur@localhost
|
+------------------------------------------+
| GRANT USAGE ON *.* TO ` nouvelUtilisateur `@`localhost` |
+------------------------------------------+

info : pour voir tous les priviléges

GRANT

La commande GRANT appliquée à un utilisateur n’existant pas crée cet utilisateur.

GRANT privilege [,privilege] ON composant TO nomUtilisateur [WITH GRANT OPTION]

➢ Exemple de création d’un utilisateur sans droits

mysql> GRANT USAGE ON *.* TO login@localhost;

L’utilisateur login peut se connecter sur n’importe quelle machine et n’a aucun droit. Il accède uniquement à la BD information_schema.

➢ Exemple de création d’un utilisateur qui peut tout consulter

mysql> GRANT SELECT ON *.* TO login ;

➢ Exemple de création d’un super-utilisateur

mysql> GRANT ALL PRIVILEGES ON *.* TO login_admin  WITH GRANT OPTION;

L’utilisateur admin peut se connecter sur la machine du serveur et a les mêmes droits que l’administrateur root. Il faut éviter de multiplier les administrateurs sur une machine en production !!!

https://zestedesavoir.com/tutoriels/730/administrez-vos-bases-de-donnees-avec-mysql/954_gestion-des-utilisateurs-et-configuration-du-serveur/3962_gestion-des-utilisateurs/#3-11933_les-privileges-introduction

Jeu de test pour GRANT

GRANT ALL PRIVILEGES ON  BDD_login.* TO 'login';
GRANT ALL PRIVILEGES ON  BDD_login2.* TO 'login'@'%';
SHOW GRANTS FOR login;

GRANT SELECT,INSERT, UPDATE, DELETE ON  BDD_login3.* TO 'login';
SHOW GRANTS FOR login;

GRANT SELECT ON *.* TO login ;
SHOW GRANTS FOR login;

FLUSH PRIVILEGES;
 
GRANT ALL PRIVILEGES ON *.* TO login_admin  WITH GRANT OPTION;

FLUSH PRIVILEGES;


GRANT SELECT,INSERT, UPDATE, DELETE ON  BDD_login2.* TO 'login';
FLUSH PRIVILEGES;

SHOW GRANTS FOR login;
SHOW GRANTS FOR login_admin;


-- depuis l'autre terminale

mysql --user=login3 --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr --database=BDD_login
mysql --user=login4 --password=secret --host=serveurmysql2.iut-bm.univ-fcomte.fr --database=BDD_login

ip address

hostname -i

documentation

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_specification [, user_specification] ...
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
    [WITH with_option ...]

object_type:
    TABLE
  | FUNCTION
  | PROCEDURE

priv_level:
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
SELECT * FROM db;


CREATE DATABASE BDD_login;
CREATE USER "login" IDENTIFIED BY  by "motdepasse"; 
GRANT ALL PRIVILEGES ON  BDD_login.* TO 'login'@'%';
FLUSH PRIVILEGES;

mysql --user=login --host=serveurmysql2.iut-bm.univ-fcomte.fr --password=motdepasse BDD_login

La liste des droits

La liste des droits

Voici la liste des droits fréquemment utilisés :

Droit Signification
ALL ou ALL PRIVILEGES TOus les droits sauf WITH GRANT OPTION.
USAGE Synonyme de “pas de droits”.
ALTER Autorise l’utilisation de ALTER TABLE.
CREATE Autorise l’utilisation de CREATE TABLE.
DELETE Autorise l’utilisation de DELETE.
DROP Autorise l’utilisation de DROP TABLE.
INSERT Autorise l’utilisation de INSERT.
INDEX Autorise l’utilisation de CREATE INDEX et DROP INDEX.
SELECT Autorise l’utilisation de SELECT.
UPDATE Autorise l’utilisation de UPDATE.
GRANT OPTION Synonyme pour WITH GRANT OPTION
Droit Signification
CREATE TEMPORARY TABLES Autorise l’utilisation de CREATE TEMPORARY TABLE.
EXECUTE Autorise l’utilisateur à exécuter des procédures stockées (pour MySQL 5.0).
FILE Autorise l’utilisation de SELECT ... INTO OUTFILE et LOAD DATA INFILE.
LOCK TABLES Autorise l’utilisation de LOCK TABLES sur les tables pour lesquelles l’utilisateur a les droits de SELECT.
PROCESS Autorise l’utilisation de SHOW FULL PROCESSLIST.
REFERENCES Réservé pour le futur.
RELOAD Autorise l’utilisation de FLUSH.
REPLICATION CLIENT Donne le droit à l’utilisateur de savoir où sont les maîtres et esclaves.
REPLICATION SLAVE Nécessaire pour les esclaves de réplication (pour lire les historiques binaires du maître).
SHOW DATABASES SHOW DATABASES affiche toutes les bases de données.
SHUTDOWN Autorise l’utilisation de mysqladmin shutdown.
SUPER Autorise une connexion unique même si max_connections est atteint, et l’exécution des commandes CHANGE MASTER, KILL thread, mysqladmin debug, PURGE MASTER LOGS et SET GLOBAL.

source

retirer des priviléges (droits)

-- etape 1

SHOW GRANTS FOR login;  
REVOKE UPDATE ON BDD_login2.* FROM login; 
SHOW GRANTS FOR login;


REVOKE ALL PRIVILEGES ON BDD_login.* FROM login;
SHOW GRANTS FOR login; 

REVOKE ALL PRIVILEGES ON BDD_login2.* FROM login;  -- supprime la ligne
SHOW GRANTS FOR login;

REVOKE ALL PRIVILEGES ON *.* FROM login; 
SHOW GRANTS FOR login;

SHOW GRANTS FOR login_admin;
REVOKE GRANT  OPTION ON *.* FROM login_admin ;
SHOW GRANTS FOR login_admin;

créer des groupes

CREATE ROLE '<role>';
CREATE ROLE '<role>'@'<host>';

GRANT <privileges> ON <database>.<object> TO '<role>'@'<host>';

SELECT CURRENT_ROLE();

https://www.prisma.io/dataguide/mysql/authentication-and-authorization/role-management

CREATE ROLE developer;
GRANT developer TO login;
GRANT SELECT,INSERT  ON BDD_login.* TO developer;
SELECT CURRENT_ROLE();

https://mariadb.com/kb/en/set-role/

SELECT CURRENT_ROLE();
SET ROLE developer;
SELECT CURRENT_ROLE();
SHOW GRANTS;
SET ROLE NONE;
SELECT CURRENT_ROLE();
SHOW GRANTS;

exercices

Exercice 1 — Droits par table

Créer dans une base login_mediatheque les tables suivantes :

CREATE TABLE login_film (id INT, titre VARCHAR(50), genre VARCHAR(30));
CREATE TABLE login_client (id INT, nom VARCHAR(50), email VARCHAR(50));
CREATE TABLE login_emprunt (id INT, id_film INT, id_client INT, date_retour DATE);

Créer trois utilisateurs :

Puis :

  1. Écrire les GRANT correspondants
  2. Vérifier avec SHOW GRANTS et SELECT * FROM mysql.db
  3. Révoquer le droit de suppression (DELETE) de login_media_employe sur login_emprunt
  4. Vérifier la modification

Exercice 2 — Droits sur colonnes

Créer dans une base login_rh la table suivante :

CREATE TABLE login_employe (
    id INT,
    nom VARCHAR(50),
    prenom VARCHAR(50),
    salaire DECIMAL(10,2),
    adresse VARCHAR(100)
);

Créer deux utilisateurs :

  1. Écrire les GRANT avec restriction par colonne
  2. Se connecter en tant que login_rh_consultant et vérifier qu’un SELECT salaire FROM login_rh.login_employe est bien refusé
  3. Vérifier qu’un SELECT nom, prenom FROM login_rh.login_employe fonctionne

Exercice 3 — Rôles (niveau avancé)

Créer dans une base login_ecole les tables suivantes :

CREATE TABLE login_eleve (id INT, nom VARCHAR(50));
CREATE TABLE login_cours (id INT, intitule VARCHAR(50));
CREATE TABLE login_note (id INT, id_eleve INT, id_cours INT, valeur DECIMAL(4,2));

Créer les rôles suivants :

Créer trois utilisateurs et leur attribuer les rôles :

Puis :

  1. Se connecter en tant que login_prof et activer son rôle avec SET ROLE
  2. Vérifier avec SELECT CURRENT_ROLE() et SHOW GRANTS
  3. Tester qu’un INSERT sur login_note fonctionne mais qu’un INSERT sur login_eleve est refusé

Exercice 4 — Synthèse (niveau avancé)

Reprendre l’exercice du cours (Alice, Bob, Caroline) en préfixant tous les objets :

CREATE DATABASE login_bdd;
CREATE USER login_Alice;
CREATE USER login_Bob;
CREATE USER login_Caroline;

CREATE TABLE login_bdd.login_TA1 (no_ta1 VARCHAR(50));
CREATE TABLE login_bdd.login_TA2 (no_ta2 VARCHAR(50));
CREATE TABLE login_bdd.login_TA3 (no_ta3 VARCHAR(50));
CREATE TABLE login_bdd.login_TB1 (no_tb1 VARCHAR(50));
CREATE TABLE login_bdd.login_TB2 (no_tb2 VARCHAR(50));
CREATE TABLE login_bdd.login_TC1 (AT1 VARCHAR(50), AT2 VARCHAR(50), AT3 VARCHAR(50), AT4 VARCHAR(50));
CREATE VIEW  login_bdd.login_VB1 AS SELECT * FROM login_bdd.login_TB1;
  1. Écrire tous les GRANT pour les tables de login_Alice (login_TA1, login_TA2, login_TA3)
  2. Écrire tous les GRANT pour les tables de login_Bob (login_TB1, login_TB2, login_VB1)
  3. Écrire les GRANT sur colonnes pour la table login_TC1 de login_Caroline (AT1, AT2 pour tous ; AT3, AT4 pour login_Bob uniquement)
  4. Gérer le cas de login_TB2 accessible à tous sauf login_Alice — expliquer pourquoi c’est impossible à exprimer directement en SQL et proposer une solution alternative (vue ou rôle)

Le point 4 est intentionnellement ouvert : MySQL/MariaDB ne permet pas d’exclure un utilisateur d’un droit global. La réflexion sur cette limitation est l’objectif.

autre exo

Exercice 3 : Droits d’accès
On considère trois utilisateurs Alice, Bob et Caroline ayant chacun respectivement un compte
A,B,C sur une base de données.
— Alice dispose de trois tables TA1, TA2, TA3
— Bob dispose de deux tables TB1, TB2 et une vue VB1.
— Caroline dispose d’une table TC1.
A partir des hypothèses suivantes, écrire les commandes SQL permettant de définir la politique
de gestion des droits d’accès.
Alice souhaite que :
— TA1 soit visible pour Bob et Caroline mais que seul Bob puisse mettre à jour ses données.
— TA2 soit privée
— TA3 soit accessible en lecture pour tout le monde (tous les utilisateurs du SGBD)
Bob souhaite que :
— TB1 soit modifiable (insertion, mise à jour et suppression) par Alice et Caroline.
— TB2 soit accessible en lecture pour tout le monde sauf pour Alice.
— VB1 soit visible uniquement pour Caroline.
Caroline souhaite que les attributs AT1 et AT2 soient visibles par tous les utilisateurs de la
base et que les attributs AT3 et AT4 soient visibles uniquement par Bob.

CREATE DATABASE login_bdd;


CREATE USER login_Alice;
CREATE USER login_Bob;
CREATE USER login_Caroline;

USE login_bdd;
CREATE TABLE IF NOT EXISTS login_bdd.login_TA1 (
no_ta1 varchar(50)
);
CREATE TABLE IF NOT EXISTS login_bdd.login_TA2 (
no_ta2 varchar(50)
);
CREATE TABLE IF NOT EXISTS login_bdd.login_TA3 (
no_ta3 varchar(50)
);

CREATE TABLE IF NOT EXISTS login_bdd.login_TB1 (
no_tb1 varchar(50)
);
CREATE TABLE IF NOT EXISTS login_bdd.login_TB2 (
no_tb2 varchar(50)
);
CREATE VIEW VB1 
AS SELECT * 
FROM login_bdd.login_TB1;

CREATE TABLE IF NOT EXISTS login_bdd.login_TC1 (
AT1 varchar(50),
AT2 varchar(50),
AT3 varchar(50),
AT4 varchar(50)
);

-- droit pour les tables de login_Alice

GRANT SELECT, INSERT, UPDATE, DELETE  ON  login_bdd.login_TA1 TO login_Bob;
GRANT SELECT  ON  login_bdd.login_TA1 TO login_Caroline, login_Bob;
GRANT SELECT  ON  login_bdd.login_TA3 TO 'login_Caroline'@'%','login_Bob'@'%';

GRANT ALL PRIVILEGES ON  login_bdd.login_TA1 TO 'login_Alice'@'%';
GRANT ALL PRIVILEGES ON  login_bdd.login_TA2 TO 'login_Alice'@'%';
GRANT ALL PRIVILEGES ON  login_bdd.login_TA1 TO 'login_Alice'@'%';

REVOKE SELECT ON login_bdd.login_TA1 FROM login_Caroline, login_Bob;
REVOKE INSERT, UPDATE, DELETE  ON  login_bdd.login_TA1 FROM login_Bob;
REVOKE SELECT ON login_bdd.login_TA3 FROM login_Caroline, login_Bob;

SHOW GRANTS FOR login_Bob;
SHOW GRANTS FOR login_Caroline;
SHOW GRANTS FOR login_Alice;

-- droit pour les tables de login_Bob

GRANT SELECT, INSERT, UPDATE, DELETE  ON  login_bdd.login_TA1 TO login_Bob;
GRANT SELECT  ON  login_bdd.login_TA1 TO login_Caroline, login_Bob;
GRANT SELECT  ON  login_bdd.login_TA3 TO 'login_Caroline'@'%','login_Bob'@'%';

GRANT ALL PRIVILEGES ON  login_bdd.login_TB1 TO login_Bob;
GRANT ALL PRIVILEGES ON  login_bdd.login_TB2 TO login_Bob;



SHOW GRANTS FOR login_Caroline;
SHOW GRANTS FOR login_Alice;
SHOW GRANTS FOR login_Bob; 

-- droit pour les tables de login_Caroline

-- GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';


SHOW GRANTS FOR login_Alice;
SHOW GRANTS FOR login_Bob; 
SHOW GRANTS FOR login_Caroline; 

DROP DATABASE login_bdd;
DROP USER login_Alice;
DROP USER login_Bob;
DROP USER login_Caroline;

https://stackoverflow.com/questions/45596542/grant-permission-to-all-columns-individually-in-mysql