Enregistrer des instructions SQL dans une table MySQL pour les exécuter ultérieurement est-il une mauvaise idée? Les instructions SQL seront prêtes à être exécutées, c'est-à-dire qu'il n'y aura pas de paramètres à échanger ou quoi que ce soit, par exemple DELETE FROM users WHERE id=1
.
Je suppose que je suis paresseux, mais j'ai pensé à cette idée parce que je travaille sur un projet qui nécessitera pas mal de tâches cron qui exécuteront périodiquement des instructions SQL.
Réponses:
C'est sûr, si c'est ce que vous demandez. Tant que vous êtes aussi attentif à votre sécurité qu'à la sécurité de vos données.
Mais ne réinventez pas la roue, les procédures stockées SONT des bits de SQL stockés dans une table. Et ils soutiennent, voire encouragent, le paramétrage.
Notez également que vous pouvez simplifier votre sécurité ET réduire le nombre de points de défaillance ET réduire les communications réseau en utilisant le MySql Event Scheduler au lieu de cron.
D'autres bases de données ont des équivalents à celles-ci, pour une bonne raison. Vous n'êtes pas le premier à avoir besoin de cette fonctionnalité.
la source
Si vous souhaitez enregistrer des instructions SQL dans une base de données pour une exécution ultérieure, il existe une meilleure option que de les placer dans une table: utilisez la fonctionnalité intégrée fournie à cet effet spécifique. Mettez-les dans des procédures stockées.
la source
Non, je dirais que ce n'est pas une bonne idée.
Cela signifie que chaque "vraie" requête / mise à jour aura besoin de 2 hits sur la base de données - un pour obtenir la "vraie" requête / mise à jour, et un pour l'exécuter.
Ce n'est peut-être pas un problème énorme dans un petit système, mais plus il y a d'utilisateurs / de transactions, moins il évoluera.
Je suppose que cela vient de la recherche d'une alternative à l'intégration de SQL dans votre code?
Encapsuler le SQL dans une procédure stockée, comme l'a suggéré Mason Wheeler, serait une façon bien meilleure que cette idée.
la source
Désolé, je ne pense pas que ce soit une bonne idée.
Considérez le cas où le tableau en question change. Supposons que votre colonne d' identification soit renommée en new_id .
En plus du changement lui-même, il existe une version de votre code écrite pour un ancien millésime de la base de données qui peut ne plus fonctionner. Bien sûr, vous devriez peut-être vérifier la table de code, mais ce n'est pas immédiatement évident pour quelqu'un d'autre.
Pour un changement tel que je l'ai décrit, je regarde généralement les fichiers SQL autonomes, les procédures stockées, les déclencheurs, le SQL en ligne dans le code client (VB, C #, C ++, etc.), mais le dernier endroit où je penserais à regarder est dans les tables de base de données. Mais peut-être que je le ferai maintenant! :)
la source
Il existe des raisons valables de stocker SQL dans une table. Le logiciel avec lequel je travaille au travail comprend maintenant un système de génération de documents et les documents doivent inclure des calculs assez complexes utilisant des données dans une base de données. Les documents sont mis à jour fréquemment, sont souvent très différents en termes de données nécessaires et de calculs à effectuer. SQL est utilisé, fondamentalement, comme langage de script pour effectuer ces calculs et que SQL est stocké dans des tables qui stockent également d'autres informations pour ces documents. Les personnes qui gèrent ces documents ne sont pas des programmeurs ou des administrateurs de base de données, mais ils connaissent le schéma de base de données et maîtrisent SQL. Ce serait une surcharge importante pour eux de maintenir ce code SQL sous la forme de procédures stockées.
Pour ce que vous avez décrit - "... un projet qui nécessitera pas mal de tâches cron qui exécuteront périodiquement des instructions SQL" - les autres réponses sont probablement correctes en suggérant que vous avez utilisé des procédures de stockage, ou l'équivalent, pour le SGBD que vous ' réutiliser.
Un bon critère pour décider s'il est judicieux de stocker du SQL dans une table par rapport à une procédure stockée est de déterminer qui maintiendra ce SQL. Si les utilisateurs maintiennent ce SQL, c'est-à-dire qu'ils l'écrivent et le modifient quand ils le souhaitent, alors il peut être parfaitement correct, et même préférable, de stocker ce SQL dans une table. Si les développeurs maintiennent ce SQL, il doit être stocké sous une forme qui peut être mise à jour par vos procédures de construction et de déploiement (espérons-le automatisées), par exemple stockées en tant qu'objet comme une procédure stockée dans la base de données elle-même.
la source
Le moyen le plus simple serait d'avoir un fichier .ini ou un autre fichier de configuration pour conserver les requêtes. De cette façon, vous pouvez les avoir au même endroit, changer quoi que ce soit sans avoir à accéder à la base de données pour le faire, ne pas frapper la base de données plusieurs fois et vous pouvez également vouloir / besoin à un moment donné d'utiliser des paramètres ou d'ajouter des conditions à vos requêtes (augmentez-les avec des choses plus complexes pour un cas particulier dans votre code).
Bien sûr, vous pouvez les garder au niveau de la base de données (soit dans une table ou, mieux encore, en tant que procédures stockées), mais si vous êtes aussi paresseux que moi ;-) mais vous êtes également préoccupé par les performances, un fichier .ini et PHP la méthode bien-aimée parse_ini pour le lire, est la voie à suivre (si vous optez pour un autre langage de programmation, vous êtes seul à trouver des approches similaires)! Habituellement, je lis ce fichier dans le chargeur de démarrage de l'application et le conserve dans un objet statique (peut-être avec une couche de cache en haut) pour vraiment accélérer les choses si nous parlons d'un très grand nombre de requêtes distinctes.
la source
Si vous n'avez besoin de l'instruction SQL qu'une seule fois, par exemple, si vous mettez en file d'attente un tas d'opérations à effectuer pendant les heures creuses, alors oui, les mettre dans une table fonctionnera très bien.
Si vous devez exécuter la même instruction SQL à des intervalles spécifiés, la route de procédure stockée mentionnée par d'autres est probablement un meilleur choix pour vous.
Cela dit, ce que vous demandez est assez inhabituel et peut être le signe d'un autre problème. Par exemple, si vous attendez de supprimer un utilisateur d'une base de données, il peut être préférable d'appeler un script planifié qui effectue l'opération via votre code d'application, plutôt que d'enregistrer les instructions SQL réelles. De cette façon, le SQL et le code ne sont jamais désynchronisés.
la source