Archives de la liste a​i​d​e​@p​a​h​e​k​o​.c​l​o​u​d​

cnil et suppression des données

yoan Texier

03/06/2022 14:05:24

Bonjour,

La loi (cnil) impose que nous ne gardions aucune données personnelle 
(nom, prénom, mails...) au delà de 3 ans après la dernière ré-adhésion.

Je me suis fait une requête SQL pour identifier ces personnes.

La question est : est-il possible de supprimer tous ces comptes d'un 
seul coup, ou bien doit-on le faire un par un ?

Question corollaire : est-il possible de supprimer une liste de comptes 
identifiés, par exemple via leur n° ID ?

Merci.

/PS pour qui est intéressé·e : requête allant chercher d'une part dans 
un champ renseigné lors de l'inscription du membre (première 
inscription)///et d'autre part dans ////les "activités - cotisation".//

/SELECT m.nom, m.email FROM membres m//
//WHERE (m.id NOT IN ( SELECT id FROM membres WHERE 
date_inscription>='2019-06-25')//
//AND m.id NOT IN (SELECT m.id FROM services_users AS cm, membres AS m//
//WHERE cm.date>='2019-06-25' AND m.id=cm.id_user))/

cnil et suppression des données

BohwaZ/Garradin

03/06/2022 14:44:37

Il faut que tu rajoute l'ID du membre dans une colonne nommée
"_user_id" et tu pourra alors cocher les membres et faire l'action de
supprimer (en bas à droite de la liste).

Ici pour sélectionner les membres qui n'ont pas renouvelé depuis le 1er
juin 2019 :

Exemple :

SELECT nom, email, id AS _user_id
FROM membres
WHERE id IN (
  SELECT id_user
  FROM services_users
  WHERE MAX(date) < '2019-06-01'
  GROUP BY id_user
);

Si tu es en auto-hébergement, tu peux aussi juste anonymiser tes fiches
membres (tu garde le numéro d'adhérent + historique des activités, mais
efface les données personnelles), c'est une bonne alternative à la
suppression.

Il faut juste faire la requête depuis en dehors de Garradin (qui
n'autorise pas de modifier directement la base de données pour des
raisons de sécurité).

Exemple pour anonymiser nom, adresse et email (rajouter autant de
champs que tu veux) :

UPDATE membres
SET nom = NULL, adresse = NULL, email = NULL
WHERE id IN (
  SELECT id_user
  FROM services_users
  WHERE MAX(date) < '2019-06-01'
  GROUP BY id_user
);

cnil et suppression des données

BohwaZ/Garradin

03/06/2022 14:48:49

Oups j'ai fait une erreur dans la requête, ce n'est pas WHERE mais
HAVING qu'il faut utiliser :

SELECT nom, email, id AS _user_id
FROM membres
WHERE id IN (
  SELECT id_user
  FROM services_users
  GROUP BY id_user
  HAVING MAX(date) < '2019-06-01'
);

et pour la seconde requête :

UPDATE membres
SET nom = NULL, adresse = NULL, email = NULL
WHERE id IN (
  SELECT id_user
  FROM services_users
  GROUP BY id_user
  HAVING MAX(date) < '2019-06-01'
);


Au passage, pourquoi utiliser MAX(date) et pas juste date ? Et bien
parce qu'un membre peut avoir plusieurs inscriptions, si tu met juste
"date" ça en prendra une au hasard, et donc tu aura des membres qui se
sont réinscrits plus tard qui seront sélectionnés (et donc supprimés
alors qu'il ne fallait pas). Utiliser MAX(date) permet d'être sûr que
c'est bien la dernière inscription à une activité qui est sélectionnée.

Attention si tu as plusieurs activités cette requête ne fait pas de
différence entre les activités. Si tu as une activité "cotisation" dont
l'ID est 42 par exemple, il faut rajouter "WHERE id_service = 42" dans
la sous-requête :)