Chapitre 12 minAvancé
Pourquoi les procédures stockées ?
Par Josselyn C., prof de BTS SIO. Mis à jour le .
Le probleme
Dans une application classique (PHP, Java, Python), le code SQL est ecrit directement dans le code applicatif. Quand une meme requete complexe est executee 100 fois par jour depuis differents endroits du programme, on obtient :
- Duplication : la meme requete est copiee dans 15 fichiers differents. Si la structure de la table change, il faut modifier 15 fichiers.
- Risque d'erreur : un developpeur modifie la requete dans un fichier mais oublie les 14 autres.
- Securite faible : l'application doit avoir un acces direct aux tables (SELECT, INSERT, UPDATE, DELETE). Si l'application est compromise, l'attaquant a acces a tout.
- Performance sous-optimale : chaque requete envoyee depuis l'application doit etre analysee, optimisee et compilee par MySQL a chaque execution.
La solution
Stocker la logique SQL directement dans la base de donnees, sous forme de procedures stockees. L'application n'envoie plus la requete complete : elle appelle la procedure par son nom.
Avant (code PHP) :
// Fichier 1
$sql = "SELECT * FROM client WHERE ville = 'Paris' ORDER BY nom";
// Fichier 2 — meme requete, copiee
$sql = "SELECT * FROM client WHERE ville = 'Paris' ORDER BY nom";
// Fichier 3 — quelqu'un a oublie le ORDER BY
$sql = "SELECT * FROM client WHERE ville = 'Paris'";
Apres (code PHP avec procedure stockee) :
$sql = "CALL clients_par_ville('Paris')";
La requete n'existe qu'a un seul endroit : dans la base de donnees.
Les quatre avantages
| Avantage | Explication |
|---|---|
| Performance | La procedure est analysee et compilee une seule fois par MySQL. Les appels suivants reutilisent le plan d'execution. |
| Securite | On peut donner a l'application uniquement le droit EXECUTE sur les procedures, sans aucun droit direct sur les tables. |
| Maintenance | Le code SQL existe a un seul endroit. Une modification se fait une fois, pas dans 15 fichiers. |
| Reutilisation | Toute application (PHP, Java, Python) peut appeler la meme procedure. Le code SQL n'est pas lie a un langage. |