Quelques observations
Les procédures stockées vous permettent de réutiliser le code et de l’encapsuler (deux piliers du développement logiciel),
Seulement si vous les utilisez correctement dans le contexte dans lequel elles sont censées être utilisées. On peut dire la même chose à propos des fonctions (en programmation structurée) ou des méthodes (en programmation orientée objet), et pourtant, nous voyons des fonctions 1K et des objets méga-ass.
Les artefacts ne vous donnent pas ces avantages. L'utilisation appropriée de ces artefacts est ce qui confère ces avantages.
sécurité (vous pouvez accorder / révoquer des autorisations sur un proc stocké),
Oui. C'est un bon point et l'une des principales raisons pour lesquelles j'aime les procédures stockées. Ils fournissent un contrôle d'accès plus fin que ce que l'on peut généralement obtenir uniquement avec des vues et des comptes d'utilisateurs.
vous protéger des attaques par injection SQL,
Cela n’est pas spécifique aux SP car vous pouvez obtenir le même niveau de protection avec des instructions SQL paramétrées et un nettoyage d’entrée. J'utiliserais des SP en plus de ceux, cependant, en matière de "sécurité en profondeur" .
et aide également avec la rapidité (bien que le DBA ait dit qu'à partir de SQL Server 2008, même les requêtes SQL régulières soient compilées si elles sont exécutées suffisamment de fois).
Cela dépend fortement du fournisseur de base de données, mais en général, votre DBA a raison. Les instructions SQL (statiques ou paramétrées) sont compilées. Les SP peuvent vous aider si vous souhaitez / avez besoin d'agréger et de calculer des données que vous ne pouvez pas utiliser avec de simples instructions SQL, mais qui sont étroitement intégrées à SQL et ne garantissent pas l'aller-retour au serveur d'applications.
Un bon exemple consiste à interroger des données dans un curseur temporaire (ou des curseurs) à partir desquels exécuter un autre SQL lui-même. Vous pouvez le faire par programme dans le serveur d'applications, ou vous pouvez enregistrer les allers-retours multiples en le faisant dans la base de données.
Cela ne devrait cependant pas être la norme. Si vous avez beaucoup de cas, c'est un signe de mauvaise conception de la base de données (ou vous extrayez des données de schémas de base de données peu compatibles entre les départements.)
Nous développons une application complexe utilisant la méthodologie de développement logiciel Agile.
L'agilité concerne les processus d'ingénierie logicielle et la gestion des exigences, et non les technologies.
Quelqu'un peut-il penser aux bonnes raisons pour lesquelles il ne souhaite pas utiliser de procs stockées?
Mauvaise question
La question est fausse et équivaut à se demander "existe-t-il de bonnes raisons de ne pas utiliser GOTO"? Je suis plus du côté de Niklaus Wirth que de Dijkstra à ce sujet. Je peux comprendre d'où vient le sentiment de Dijkstra, mais je ne crois pas qu'il soit applicable à 100% dans tous les cas. Même chose avec les procs du magasin et n'importe quelle technologie.
Un outil est bon lorsqu'il est utilisé correctement et dans le but recherché. L’utiliser autrement ne signifie pas que l’outil est mauvais, mais que le porteur ne sait pas ce qu’il fait.
La bonne question est "quel type de modèles d'utilisation de procédures stockées doit être évité". Ou, "dans quelles conditions dois-je (ou ne pas) utiliser des procédures stockées" . Rechercher des raisons de ne pas utiliser une technologie revient simplement à blâmer l'outil plutôt qu'à placer la responsabilité de l'ingénieur clairement à l'endroit où elle se situe - dans l'ingénieur.
En d'autres termes, c'est une échappatoire ou une déclaration d'ignorance.
J'imaginais que les administrateurs de base de données ne voulaient pas conserver ces processus stockés, mais il semble y avoir trop de points négatifs pour justifier une telle décision de conception.
Ce qu'ils font alors, c'est projeter les résultats de leurs mauvaises décisions d'ingénierie sur les outils qu'ils ont mal utilisés.
Que faire dans votre cas?
Mon expérience est, quand à Rome, fais comme les Romains .
Ne le combat pas. Si les membres de votre entreprise souhaitent qualifier les procédures de magasin de mauvaises pratiques, laissez-les. Soyez avisé cependant que cela peut être un drapeau rouge dans leurs pratiques d'ingénierie.
L'étiquetage typique des choses comme étant une mauvaise pratique est généralement utilisé dans les organisations avec des tonnes de programmeurs incompétents. En faisant une liste noire de certaines choses, l’organisation tente de limiter les dommages causés en interne par leur propre incompétence. Je te chie pas.
Les généralisations sont la mère de tous les problèmes. Dire que les procs stockés (ou tout type de technologie) est une mauvaise pratique, c'est une généralisation. Les généralisations sont des échappatoires pour les incompétents. Les ingénieurs ne travaillent pas avec des généralisations flagrantes. Ils effectuent des analyses au cas par cas, effectuent des analyses de compromis et exécutent les décisions et solutions techniques en fonction des faits, dans le contexte dans lequel ils sont censés résoudre un problème.
Les bons ingénieurs n'affichent pas les choses comme de mauvaises pratiques de manière aussi générale. Ils examinent le problème, choisissent l'outil qui convient, font des compromis. En d'autres termes, ils font de l'ingénierie.
Mon avis sur comment ne pas les utiliser
Ne mettez pas de logique complexe au-delà de la collecte de données (et peut-être de certaines transformations). Il est correct d'y insérer une logique de traitement de données ou d'agréger le résultat de plusieurs requêtes. Mais c'est à peu près tout. Au-delà, cela constituerait une logique d’entreprise qui devrait résider ailleurs.
Ne les utilisez pas comme seul mécanisme de défense contre l’injection SQL. Vous les laissez là au cas où quelque chose de mauvais les gênerait , mais il devrait y avoir une série de logique défensive devant eux - validation / nettoyage côté client, validation / nettoyage côté serveur, éventuellement transformation en types qui ont un sens dans votre modèle de domaine, et finalement être passé à des instructions paramétrées (pouvant être des instructions SQL paramétrées ou des procédures stockées paramétrées).
Ne faites pas des bases de données le seul endroit contenant vos procs de magasin. Les procédures de votre magasin doivent être traitées de la même manière que votre code source C # ou Java. Autrement dit, le contrôle de source définit la définition textuelle de vos processus de magasin. Les gens disent que les processus des magasins ne peuvent pas être contrôlés à la source - bullcrap, ils ne savent tout simplement pas de quoi diable ils parlent.
Mon opinion sur comment / où les utiliser
Votre application nécessite des données qui doivent être transposées ou agrégées à partir de plusieurs requêtes ou vues. Vous pouvez décharger cela de l'application dans la base de données. Ici, vous devez faire une analyse de performance car a) les moteurs de base de données sont plus efficaces que les serveurs d'applications, mais b) les serveurs d'applications sont (parfois) plus faciles à faire évoluer horizontalement.
Contrôle d'accès au grain fin. Vous ne voulez pas qu'un idiot exécute des jointures cartésiennes dans votre base de données, mais vous ne pouvez pas simplement empêcher des personnes d'exécuter des instructions SQL arbitraires comme cela non plus. Une solution typique consiste à autoriser des instructions SQL arbitraires dans les environnements de développement et UAT, tout en les interdisant dans les environnements systest et de production. Toute déclaration qui doit parvenir à systest ou à la production va dans une procédure de magasin, révisée par le code à la fois par les développeurs et par dbas.
Tout besoin valide d'exécuter une instruction SQL qui ne se trouve pas dans un processus de magasin passe par un nom d'utilisateur / compte et un pool de connexions différents (l'utilisation est fortement surveillée et déconseillée).
- Dans les systèmes comme Oracle, vous pouvez accéder à LDAP, ou créer des liens symboliques vers des bases de données externes (dire appeler un proc magasin sur db un partenaire commercial via vpn.) Un moyen facile de faire du code spaghetti, mais ce qui est vrai pour tous les paradigmes de programmation, et parfois vous avez des exigences commerciales / environnementales spécifiques pour lesquelles il s'agit de la seule solution. Store procs help encapsule cette méchanceté au même endroit, à proximité des données et sans passer par le serveur d'applications.
Que vous l'exécutiez sur la base de données en tant que procédure de magasin ou sur votre serveur d'applications dépend de l'analyse des compromis que vous devez effectuer en tant qu'ingénieur. Les deux options doivent être analysées et justifiées par un certain type d'analyse. Aller d'une manière ou d'une autre en accusant simplement l'autre solution de rechange est une "mauvaise pratique", c'est juste une échappatoire ingénieuse en ingénierie.
- Dans les cas où vous ne pouvez tout simplement pas augmenter votre serveur d'applications (.... Aucun budget pour le nouveau matériel ou les instances de cloud), mais avec beaucoup de capacité sur le back-end de la base de données (c'est plus typique que beaucoup de gens veulent bien admettre), cela rapporte déplacer la logique métier pour stocker les procs. Pas beau et peut conduire à des modèles de domaine anémique ... mais encore une fois ... une analyse de compromis, la chose la plupart des hacks de logiciels sucent.
Que cela devienne une solution permanente ou non, c'est spécifique aux contraintes observées à ce moment particulier.
J'espère que ça aide.