Quand devrais-je utiliser des procédures stockées?
Quand devrais-je utiliser des procédures stockées au lieu de simplement écrire la logique directement dans mon application? J'aimerais récolter les avantages de procédures stockées, mais je voudrais aussi de ne pas avoir ma logique de l'application répartie sur la base de données et l'application.
Existe-il des règles de base que vous pouvez penser en référence à cela?
- Proposer la suppression de la balise php php pourrait facilement être n'importe quel autre langage de programmation.
Vous devez vous connecter pour publier un commentaire.
Wow... je vais nager directement à contre-courant ici et dire, "presque toujours". Il y a une liste de blanchisserie de raisons que certains/beaucoup de qui je suis sûr que d'autres diront. Mais j'ai développé des applications à la fois avec et sans l'utilisation de l'stockés procs comme une couche d'accès aux données, et il a été mon expérience que, bien écrit, des procédures stockées en faire tellement plus facile d'écrire votre application. Puis il y a le bien documenté, les performances et la sécurité des prestations.
Cela dépend entièrement de votre environnement. La réponse à la question n'est pas vraiment un problème de codage, ou même une analyse de la question, mais une décision d'affaires.
Si votre base de données prend en charge une seule application, et qui est raisonnablement étroitement intégré avec elle, alors il est préférable, pour des raisons de souplesse, de placer votre logique à l'intérieur de votre programme d'application. Dans ces circonstances, la manipulation de la base de données simplement comme un simple dépôt de données à l'aide de la fonctionnalité commune perd de vous peu et les gains de flexibilité - avec les fournisseurs, mise en œuvre, le déploiement et bien d'autres - et beaucoup de puriste arguments que les "bases de données pour les données" foule sont démonstratif vrai.
D'autre part, si vous êtes à la manipulation d'une base de données d'entreprise, qui peuvent généralement être identifiés par le fait d'avoir plusieurs chemins d'accès, alors il est fortement conseillé de visser la sécurité autant que vous le pouvez. À tout le moins, toutes les contraintes activé, et si possible l'accès aux données devrait être à travers des vues et des procédures seulement. Pleurnicher les programmeurs doivent être ignorés dans ces cas-là...
Codeurs qui plongent dans les guerres de religion au cours de l'utilisation ou non de l'accord SPs ont généralement travaillé dans un seul environnement ou de l'autre de sorte qu'ils extrapoler leur manque d'expérience en fonte de fer de position qui vont en effet être parfaitement défendable et correct dans le contexte dont ils sont issus, mais rate la grande image. Comme toujours, vous devez vous rendre de décision sur les besoins de l'entreprise/clients/utilisateurs et non pas sur le type de codage de la méthodologie que vous préférez.
Je l'ai dit dans un commentaire, mais je vais le dire encore une fois ici.
De sécurité, sécurité, Sécurité.
Lorsque le code sql est intégré dans votre application, vous avez à exposer les tables sous-jacentes à l'accès direct. Cette pourrait son accord au premier abord. Jusqu'à ce que vous obtenir le coup avec certains d'injection sql qui brouille tous les champs varchar dans votre base de données.
Certaines personnes pourraient dire qu'ils contourner ce problème en utilisant la magie des citations ou d'une autre façon de correctement échapper à leur embedded sql. Le problème, cependant, est l'une requête de dev n'a pas échappé correctement. Ou, le dev qui a oublié de ne pas permettre au code d'être téléchargé. Ou, le serveur web a été fissuré qui a permis à l'attaquant de code de téléchargement. Ou,... vous obtenez le point. Il est difficile de couvrir toutes vos bases.
Mon point est, tous des bases de données modernes de sécurité intégré. Vous pouvez tout simplement refuser direct d'accès à la table (select, insert, update, et supprime) et la force de tout pour aller par le biais de votre s'procs. Ce faisant générique attaques ne fonctionnent plus. Au lieu de cela, l'attaquant aurait pu prendre le temps d'apprendre les détails les plus intimes de votre système. Cela augmente leur "coût" en termes de temps passé et s'arrête en voiture et par le ver attaques.
Je sais que nous ne pouvons pas sûr de nous-mêmes à l'encontre de tout, mais si vous prenez le temps de l'architecte de vos applications, de sorte que le coût pour la fissure, il l'emporte de loin sur les avantages alors vous allez grave de réduire votre risque de perte de données. Cela implique de prendre avantage de tous les outils de sécurité disponibles pour vous.
Enfin, quant à l'idée de ne pas utiliser le s'procs parce que vous pourriez avoir à port à un autre sgbdr: d'Abord, la plupart des applications ne modifiez pas les serveurs de base de données. Deuxièmement, dans le cas où il est une possibilité réelle, vous avez le code à l'aide de la norme ANSI sql de toute façon; ce que vous pouvez faire dans votre procs. Troisièmement, vous devez réévaluer l'ensemble de votre code sql n'importe quoi, et c'est beaucoup plus facile lorsque ce code est dans un seul endroit. Quatrièmement, tous des bases de données modernes maintenant prise en charge de s'procs. Cinquièmement, lors de l'utilisation de s'proc vous pouvez personnaliser votre sql pour la base de données, il est exécuté en vertu de profiter de la base de données sql extensions.
J'ai tendance à éviter les procédures stockées. Les outils de débogage ont tendance à être plus primitif. Rapport d'erreur peut être plus difficile (vs votre journal du serveur de fichiers) et, pour moi, au moins, il semble juste d'ajouter une autre langue pour aucun gain réel.
Il y a des cas où il peut être utile, en particulier lors du traitement de grandes quantités de données sur le serveur et bien sûr pour les déclencheurs de base de données que vous ne pouvez pas le faire dans le code.
Autre que cela, j'ai tendance à tout faire dans le code et de traiter la base de données comme un gros vidage de données, plutôt que de quelque chose que je exécuter du code sur.
Envisager Qui A Besoin De Procédures Stockées, De Toute Façon?:
et Pourquoi je ne suis pas d'utiliser des Procédures Stockées:
Fondamentalement, lorsque vous avez à effectuer des opérations impliquant des données qui n'ont pas besoin de sortir de la base de données. Par exemple, vous souhaitez mettre à jour une table avec des données provenant d'une autre, il n'a guère de sens pour obtenir les données, puis de nouveau si vous pouvez faire tout en un seul coup à la db.
Une autre situation où il peut être acceptable d'utiliser des procédures stockées, c'est quand vous êtes sûr à 100%, vous n'aurez plus jamais de déployer votre application à un autre fournisseur de base de données. Si vous êtes un Oracle de la boutique et vous avez beaucoup d'applications de parler de la même base de données, il peut être judicieux d'avoir stocké des procédures afin de s'assurer que tous d'entre eux parlent de la db de manière cohérente.
Compliqué requêtes de base de données, pour moi, ont tendance à finir comme stockée procs. Une autre pensée à considérer est que votre base de données peut être complètement séparé et distinct de la demande. Disons que vous exécutez une DB Oracle et vous sont essentiellement la construction d'une API pour d'autres développeurs d'applications au sein de votre organisation pour l'appeler. Vous pouvez cacher les trucs compliqués d'eux et de fournir une procédure stockée à sa place.
Un exemple très simple:
pourrait finir quelques requêtes différentes (vérifier si elle existe, de créer des entrées dans un tableau des préférences, etc) et vous pouvez encapsuler eux.
Bien sûr, des personnes différentes ont des points de vue différents (un DBA par rapport à un Programmeur).
J'ai utilisé stockées procs dans 1 des 3 scénarios:
Vitesse
Quand la vitesse est de la plus haute importance, procédures stockées fournir une excellente méthode
Complexité
Quand je suis à jour plusieurs tables et de la logique de code peut changer en bas de la route, je peux mettre à jour les procédures stockées et éviter une recompilation. Les procédures stockées sont un excellent boîte noire méthode pour mettre à jour un grand nombre de données en un seul coup.
Transactions
Quand je fais un insert, delete ou update qui s'étend sur plusieurs tables. J'enveloppe le tout dans une transaction. Si il y a une erreur, il est très facile de restaurer la transaction et de lever une erreur à éviter la corruption des données.
Bas 2 sont très faisable dans le code. Cependant, les procédures stockées fournir une "boîte noire" de la méthode de travail complexes et le niveau de transaction opérations sont importantes. Sinon, tenez-vous avec le code de base de données d'opérations.
De sécurité utilisé pour être une des raisons. Cependant, avec LINQ et d'autres Orm là, au niveau du code DAL opérations sont beaucoup plus sûres qu'elles ne l'ont été dans le passé. Stockées procs SONT en sécurité, mais sont Orm comme LINQ.
Il peut également être très utile comme une question de l'encapsulation et de la philosophie de la SEC. J'ai par exemple l'utilisation des fonctions stockées pour les calculs à l'intérieur d'un tableau que j'ai besoin de plusieurs requêtes à l'intérieur du code. De cette façon, j'utilise le mieux la performance ainsi que l'veiller à ce que le calcul se fait toujours de la même façon.
Je ne voudrais pas l'utiliser pour plus de fonctionnalité ou de la logique devrait être dans la couche métier de l'architecture, mais se sont concentrés sur le modèle de la couche, où la fonctionnalité est clairement axé sur la conception de base de données et de souplesse possible de changer la conception de base de données sans casser l'API pour les autres couches.
Nous utiliser des procédures stockées pour l'ensemble de nos besoins en matière de reporting. On peut généralement récupérer les données plus rapidement et de façon à ce que le rapport peut juste cracher directement au lieu d'avoir à faire toute sorte de calculs ou similaire.
Nous allons aussi utiliser des procédures stockées pour les complexes ou les requêtes compliquées que nous devons faire, ce serait difficile à lire s'ils étaient à l'intérieur de notre base de code.
J'ai tendance à toujours utiliser des procédures stockées. Personnellement, je trouve qu'il rend tout plus facile à maintenir. Ensuite, il ya la sécurité et de considérations de performance.
Assurez-vous juste que vous écrivez propre, bien aménagé et bien documentée des procédures stockées.
Quand tout le code est dans une procédure stockée, il est beaucoup plus facile de revoir la base de données lorsque nécessaire. Les changements à la logique sont beaucoup plus facile à pousser ainsi. Il est aussi beaucoup beaucoup plus facile de réglage de la performance et tôt ou tard, le réglage des performances devient nécessaire pour la plupart des applications de base de données.
Sur le dessus de la vitesse et des considérations de sécurité, j'ai tendance à coller autant dans des Procédures Stockées que possible pour la facilité de maintenance et de modifications. Si vous mettez la logique de votre application, et de trouver plus tard que la logique sql a une erreur ou besoin de travailler différemment, d'une certaine manière, vous devez recompiler et de redéployer l'ensemble de l'application dans de nombreux cas (surtout si c'est un app comme WPF, Windows-Formes, etc). Si vous gardez la logique de la procédure stockée, tout ce que vous avez à faire est de mettre à jour le proc et vous ne jamais avoir à toucher à la demande.
Je dirais que vous devriez éviter de procédures stockées.
Pourquoi peut-on l'éviter?
Pour éviter serré de couplage entre les applications et les bases de données. Si nous utilisons des procédures stockées, nous ne serons pas en mesure de facilement changer notre base de données sous-jacente dans l'avenir, parce que nous aurions à:
Parce que le code-first est une chose. Il y a plusieurs Formulaires qui peuvent nous permettre de cibler n'importe quelle base de données et même de gérer les schémas de table sans jamais avoir besoin de toucher la base de données. Orm comme Entity Framework ou Dapper permettre aux développeurs de se concentrer sur les caractéristiques de l'immeuble au lieu d'écrire des procédures stockées et le câblage dans l'application.
C'est encore une autre chose que les développeurs doivent apprendre afin d'être productif. Au lieu de cela, ils peuvent écrire les requêtes en tant que partie des applications qui rend les requêtes beaucoup plus simple à comprendre, à maintenir, et de modifier par les développeurs qui sont la création de nouvelles fonctionnalités et/ou la correction des bugs.
Je connais une société qui a été fortement tributaire de procédures stockées. Comme le nombre de microservices s'est accru et que la base de données originale orientée vers les développeurs de gauche, la société a été laissé avec une boîte noire que personne n'a le droit de toucher, de peur qu'il prendrait tout bas. Maintenant qu'ils veulent passer à une autre base de données et de les déplacer vers le cloud, il est beaucoup plus difficile qu'il doit être et qu'ils sont en mouvement la procédure stockée logique dans leurs applications, de toute façon.
Les procédures stockées sont une méthode de recueil des opérations qui devraient être réalisées sur la base de données côté, tout en leur maintien sur la base de données côté.
Cela comprend:
etc.
Le principal problème avec les procédures stockées, c'est qu'ils sont difficiles à maintenir.
Vous, par conséquent, devrait rendre les procédures stockées que facile à entretenir que toutes vos autres code.
J'ai un article à ce sujet dans mon blog:
J'ai eu quelques mauvaises expériences avec cette.
Je ne suis pas opposé à des procédures stockées à leur place, mais l'utilisation gratuite de procédures stockées peuvent être très coûteux.
D'abord, exécuter des procédures stockées sur le serveur de base de données. Cela signifie que si vous avez un environnement multi-serveur avec 50 serveurs web et un serveur de base de données, au lieu de répartir les charges de travail de plus de 50 machines à bas prix, vous chargez un cher (depuis le serveur de base de données est généralement construit comme un poids lourd du serveur). Et vous risquez de créer un point unique de défaillance.
Deuxièmement, il n'est pas très facile d'écrire une application uniquement dans des procédures stockées, bien que j'ai couru dans un qui fait un effort surhumain pour tenter de. Donc, vous vous retrouvez avec quelque chose qui est cher à entretenir: Il est mis en œuvre dans 2 différents langages de programmation, et le code source est souvent pas tous dans un endroit, depuis les procédures stockées sont définitivement stockées dans le SGBD et pas dans une archive source. En supposant que quelqu'un a jamais réussi/dérangé o les tirer de la base de données du serveur et des sources d'archives à tous.
Donc, mis à part un assez salissante, application architecture, vous pouvez également limiter le nombre de qualifiés chimpanzés qui peut maintenir, comme plusieurs compétences sont nécessaires.
D'autre part, les procédures stockées sont extrêmement utiles, SI:
Vous avez besoin pour maintenir une sorte d'intégrité des données à travers de multiples systèmes. Qui est, le numéro de la logique qui n'appartient pas à une seule application, mais vous avez besoin de la cohérence du comportement de tous les participants apps. Une certaine quantité de ce qui est presque inévitable dans le moderne-jour des applications sous la forme de clés étrangères et les déclencheurs, mais de temps en temps, les grands de l'édition et de validation peut être justifiée en tant que bien.
Vous avez besoin de la performance qui ne peut être atteint que par l'exécution d'une logique sur le serveur de base de données elle-même et non pas comme un client. Mais, comme je l'ai dit, quand vous faites ça, vous êtes alimentaires dans le total des ressources système du serveur de bases de données. Donc il vous appartient de vous assurer que si il y a des morceaux de la délinquance de fonctionnement qui PEUVENT être déchargées sur les clients, vous pouvez les séparer et laisser la substance la plus critique pour le serveur de bases de données.
Un scénario en particulier, vous êtes susceptible de bénéficier implique la situation autour de "(n+1)" problème d'évolutivité. Tout type de multidimensionnelles/hiérarchique situation est de nature à entraîner ce scénario.
Un autre scénario impliquerait les cas d'utilisation où il fait un peu de protocole lors de la manipulation des tables (astuce: des étapes définies les opérations qui sont susceptibles de l'être), ce qui pourrait bénéficier de la localité de référence: Être dans le serveur, les requêtes pourraient en bénéficier. Otoh, que, vous pourriez vous offre un lot d'instructions directement dans le serveur. Spécialement lorsque vous êtes sur un XA environnement et vous avez accès à vos bases de données fédérées.
Si vous parlez de logique d'entreprise plutôt que juste "dois-je utiliser sprocs en général" je dirais que vous devriez mettre de la logique métier dans sprocs lorsque vous êtes à la réalisation de grands définir en fonction des opérations ou à tout autre moment de l'exécution de la logique aurait besoin d'un grand nombre d'appels à la base de données de l'application.
Cela dépend aussi de votre auditoire. Est la facilité d'installation et de portabilité sur les Sgbd important pour vous?
Si votre programme doit être facile à installer et facile à exécuter sur les différents systèmes de base de données, alors vous devriez rester à l'écart à partir de procédures stockées et aussi regarder pour les non-SQL portable dans votre code.
Je suis d'accord qu'ils devraient être utilisés souvent et bien.
Le cas d'utilisation, je pense, est extrêmement convaincant et très utile, si vous prenez un lot de matière première de l'information qui devrait être séparé en plusieurs tableaux, où la partie des données peut avoir des enregistrements qui existent déjà et doivent être reliés par des étrangers id de clé, alors vous pouvez simplement S'il EXISTE des contrôles et de l'insérer si elle n'est pas ou retour si elle le fait, ce qui rend le tout plus uniforme, succinct et facile à maintenir dans le long terme.
Le seul cas dans lequel je suggère d' contre leur utilisation est si vous faites beaucoup de logique ou de calcul entre les requêtes qui se fait le mieux dans le serveur d'application OU si vous travaillez pour une société où garder tous de la logique dans le code est important pour la maintenabilité/comprendre ce qui se passe. Si vous avez un dépôt git complète de tout ce que quelqu'un pourrait avoir besoin et il est facilement compréhensible, qui peut être très précieux.