C 4. Structured Query Language - Supprimer des données
Après cette quête, tu sauras comment supprimer des données d'une base avec une requête
Objectifs
- Utiliser la requête DELETE
- Utiliser les clauses TOP & EXISTS
Efface tes traces

Une nuit, alors que tu dormais, ton corps s'est réveillé puis tu as ressenti une très forte envie de pirater. T'étant amusé toute la nuit sur divers sites, tu décides d'aller te coucher vers 7h du matin.
Dès lors que tu fermes l'oeil, quelque chose te tracasse ... Tu as l'impression d'avoir oublié quelque chose, quelque chose qui pourrait te faire payer gros pour ta soirée en solitaire. Lorsque tu as pénétré le réseau du Pentagone, tu as laissé des messages de logs dans sa base de données, tu lui as laissé de belles traces de ton passage.
Tu sautes de ton lit et attrapes ta chaise aussi vite que tu le peux. La connexion est encore ouverte, il faut que tu les supprimes le plus rapidement possible avant que quelqu'un ne constate que tu t'es introduit dans le système informatique ...
Requête DELETE
La requête DELETE sert à supprimer des enregistrements dans une base de données. Plus dangereuse que la requête UPDATE, DELETE doit être manipulée avec force précautions.
Je peux utiliser une transaction pour sécuriser les échanges, non ?
Oui, tu peux utiliser une transaction. Seulement, ça ne suffit pas, parce que si tu effaces les données, tu ne peux pas les retrouver. Avant d'utiliser une requête telle que DELETE, il est fortement conseillé de faire une sauvegarde de ta base de données. Comme cela, si jamais une fausse manipulation est accomplie, tu peux récupérer l'ancienne version et recommencer.
DELETE fonctionne comme SELECT et UPDATE: elle s'exécute sur tous les enregistrements si aucune clause WHERE ne les filtre. Ainsi, pour éviter de supprimer toutes tes données d'une table, il faut ajouter une clause WHERE exprimant les spécificités des enregistrements que tu veux supprimer.
La syntaxe de la requête DELETE est la suivante :
DELETE FROM tableName
WHERE [Conditions]
Où tableName est un nom de table, et [Conditions] les expressions booléennes SQL qui filtrent l'ensemble de données source.
D'autres mots-clés utiles
Il existe beaucoup de requêtes et de mots-clés en SQL. Transact-SQL met à disposition deux mots-clés très utiles lorsque l'on écrit des requêtes : TOP & EXISTS.
TOP filtre l'ensemble résultat pour ne retourner ou affecter que les résultats situés à partir du début de l'ensemble source.
DELETE TOP(3)
FROM LogMessages
WHERE Severity > 5;
La requête ci-dessus supprime les trois premiers résultats de l'ensemble des messages de logs ayant une sévérité égale à 5.
EXISTS est très pratique car elle permet d'exécuter une sous-requête à l'intérieur d'une requête. Si cette sous-requête retourne ensemble vide, alors le résultat de l'opération EXISTS sera évalué à false. Si la sous-requête de l'opération EXISTS renvoie au moins un résultat, alors l'opération EXISTS est évaluée à true:
DELETE
FROM LogMessages
WHERE EXISTS
(SELECT UserName FROM LogMessages
WHERE UserName = 'h4ck3r')
La requête ci-dessus supprime tous les logs s’il existe au moins un log créé pour l'utilisateur h4ck3r.
Challenge
Enlève toute preuve
Ton intrusion n'est pas passée inaperçue ! Il faut que tu supprimes ton passage dans les logs stockés en base de données pour ne pas te faire pincer.
Télécharge une base de données ici
Tu devras fournir un fichier SQL directement exécutable sur la base de données en question. Il devra supprimer tous les enregistrements pour l'utilisateur h4ck3r ainsi que les trois premiers logs.
Attention, avant toute modification, effectue une sauvegarde de la base !
Critères de validation
- Un lien vers ton fichier SQL
- Le fichier SQL doit s'exécuter sans erreur sur la même base de départ
- Les requêtes du fichier SQL doivent supprimer tous les logs de l'utilisateur
h4ck3r - Une requête du fichier supprime les trois premiers logs
- Dans le fichier SQL se trouve une requête qui effectue une sauvegarde de la base actuelle avant de lancer toute opération de suppression
- La suppression s'effectue à l'intérieur d'une transaction