SQL dynamique et recherche dans toute une base

le 20/08/2008 à 22:36
SQL dynamique et recherche dans toute une base
Tout d'abord, un rappel : on peut générer des requêtes SQL dans MySQL, et les exécuter, un peu comme le fait eval() en PHP.

Voici un exemple qui vous montre une requête SQL dynamique. 
mysql> set @sql = "select 'bonjour';";
Query OK, 0 rows affected (1.27 sec)

mysql> PREPARE insertStmt FROM @sql;
Query OK, 0 rows affected (0.92 sec)

Statement prepared

mysql> EXECUTE insertStmt;
+---------+
| bonjour |
+---------+
| bonjour |
+---------+
1 row in set (0.00 sec)

Notez bien que cette fonctionnalité peut être dévastatrice en cas d'injection SQL. Les performances ne sont pas exceptionnelles (la compilation SQL peut être assez lente), mais sera sûrement indolore pour une utilisation interactive.

La variable @sql peut être constituée de n'importe quelle source : ici c'est une chaîne littérale, mais cela peut être le contenu d'une table, une liste de table, ou autre résultat d'expression.

C'est à cela que se livre le tutoriel de SiteCrafting : comment faire pour analyser systématiquement une base de données, et repérer toutes les occurrences d'une chaîne ? Dans toutes les tables d'une base, et toutes les colonnes de chaque table.

La solution se base sur le rappel ci-dessus : information_schema donne la liste des colonnes d'une base qui peut être une chaîne, et une procédure stockée se charge de produire les commandes SQL pour chercher et remplacer dans chaque cas.

- Finding the Needle in your MySQL Haystack
- SQL Syntax for Prepared Statements

Commentaires

Ecrire

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours