Je suis assez nouveau au monde SQL. Voici mes questions: P>
Merci pour votre explication. P>
5 Réponses :
Certains des avantages que je considère lors de l'utilisation de procédures stockées p>
Je ne suis pas d'accord avec Bouma à ce sujet. Les ormes ont leur place dans le développement de logiciels, comme les procédures stockées. L'écriture d'une ou de l'autre désactivée est entièrement une mauvaise position à prendre. L'affiche originale a déclaré qu'il est "nouveau à SQL" - et, en tant que tel, apprendre tout ce qu'il peut sur les PROC et ORM stockés - ainsi, il peut prendre une décision éduquée pour chaque projet qu'il travaille sur ce qui est juste pour la situation actuelle. .
RE: SPROCS SONT BAD Article: Roubis 1) Tout SQL est fragile - Peu importe l'endroit où il se trouve, les changements de modèle nécessitent une mise à jour (Inclus de code d'application) 2) Défense d'oignon, où la sécurité est superposée. 3) Performance - Montrez-moi un curseur qui effectue plus lentement que A pour une boucle dans la langue de votre choix, et je vais vous montrer une instruction SQL en désireux besoin de réglage.
@Rexam - Bien dit. Je devais tempérer mon choix de mots lorsque je dis "mauvaise position" ...
Les procédures stockées vous permettent de stocker votre code SQL dans un endroit en dehors de l'application. Cela vous donne la possibilité de: p>
Les procédures stockées protègent contre les attaques d'injection? Pour la plupart oui. Dans SQL Server, vous pouvez créer des procédures stockées qui ne sont pas efficaces, principalement à l'aide de sp_executeql. Maintenant, cela ne signifie pas que SP_Executesql est un trou de sécurité, cela signifie simplement que plus de précaution doit être prise lors de l'utilisation. p>
Cela ne signifie pas non plus que les procédures stockées sont le seul moyen de se protéger contre cela. Vous pouvez utiliser SQL paramérité pour accomplir la même tâche de protéger contre l'injection SQL. p>
Je suis d'accord avec d'autres personnes que les procédures stockées peuvent être lourdes, mais elles ont également leurs avantages. Là où je travaille, nous avons probablement 20 bases de données de production différentes pour diverses raisons (ne demandez pas). Je travaille sur un sous-ensemble de trois ans, et mon coéquipier et je connais vraiment ces trois vraiment très bien. Comment les procédures stockées nous aident-elles? Les gens viennent à nous et quand ils doivent saisir cette information sur ces bases de données, nous pouvons l'obtenir pour eux. Nous n'avons pas à passer des heures à expliquer les schémas et quelles sont les données de normalisation. C'est une couche d'abstraction qui nous permet de programmer le code le plus efficace contre les bases de données que nous connaissons. Si ce n'est pas le cas pour vous, alors peut-être que des procédures stockées ne sont pas la voie à suivre, mais dans certains cas, ils peuvent ajouter beaucoup de valeur. p>
Changez le code SQL sans recompiler / redistribuer l'application.!? Bien sûr, il doit compiler. Juste parce que vous n'appelez pas de marque ou de fourmi ou peu importe, cela ne signifie pas que ce n'est pas compilé. Et plus important: bien sûr, vous devez le déployer ou suggérez-vous de changer de code directement dans la base de données de production?
Non, vous avez raison, j'étais signification de la compilation du code d'application (comme c # ou Java). Vous devez le déployer, dans certains cas, mais dans une pincée, vous pouvez tirer le code SQL du serveur et l'exécuter si vous devez, non pas comme une application de bureau où vous devez redéployer pour éventuellement des centaines de machines.
Pour la plupart des cas Oui, l'injection SQL est beaucoup moins probable avec une procédure stockée. Bien que des moments où vous souhaitez passer une procédure stockée, des données nécessitant une utilisation dynamique SQL à l'intérieur de la procédure stockée, puis vous êtes de retour où vous avez commencé. En ce sens, je n'en vois aucun avantage sur l'utilisation de requêtes paramétrées dans les langages de programmation qui les soutiennent. P>
Personnellement, je déteste les procédures stockées. Avoir un code dans deux endroits disjoints est une douleur dans le cul et il déploie beaucoup plus compliqué. Je ne préconise pas la jumellation de votre code avec des déclarations SQL soit car cela conduit à sa propre série de maux de tête. P>
Je recommande une couche DAL implémentée une des deux manières. P>
Oubliez les procédures stockées. Utilisez un orm. P>
Ou mieux encore - utilisez un orj qui utilise des Procs stockés.
@Scott: N'était pas conscient d'exister mais oui, ce serait une option fine aussi.
Procédures stockées uniquement directement em> empêche l'injection SQL si vous les appelez de manière paramérisée. Si vous avez toujours une chaîne dans votre application avec le nom de la procédure et sur les paramètres de concaténate de l'entrée de l'utilisateur à cette chaîne de votre code, vous aurez toujours des problèmes. p>
Toutefois, lorsqu'il est utilisé exclusivement, em> les procédures stockées vous permet d'ajouter une protection supplémentaire en vous permettant de désactiver les autorisations à tout sauf la commande EXEC. Outre cette situation, des requêtes paramétrées / des énoncés préparés sont normalement mis en cache par le serveur, et aussi comme une procédure stockée dans presque tous les égards. p>
Malgré cela, les procédures stockées ont deux grands avantages pour les plus grandes entreprises: P>
Bien sûr, ces avantages ne sont pas sans frais: p>
Bien que vos avantages soient fidèles dans les entreprises intermédiaires et grandes entreprises où il y a une DBA sur le personnel, il crée des œuvres de cauchemars pour des personnes comme moi qui gagnent la vie à nettoyer le code des autres. L'avantage de la performance ne vaut tout simplement pas le risque d'abus dans une petite entreprise.
Une manière dans laquelle les procédures stockées (celles qui n'utilisent pas Dynamic SQL) peuvent rendre l'ensemble de l'application plus sécurisée est que vous pouvez désormais définir les autorisations au niveau de la procédure stockée et non au niveau de la table. Si vous accédez à tous vos données de cette façon (et interdisez dynamique SQL!) Cela signifie que les utilisateurs ne peuvent en aucun cas se rendre à la base de données qui ne figure pas dans une procédure stockée. Les développeurs veulent toujours dire que leur code de candidature peut protéger contre les menaces extérieures, mais ils semblent oublier que les menaces intérieures sont souvent beaucoup plus graves et permettant aux autorisations au niveau de la table, elles sont à la merci de tout utilisateur qui peut trouver un moyen Pour interroger directement la base de données en dehors de l'application (une autre raison pour laquelle dans les grands magasins, seules deux ou trois personnes ont au maximum des droits de production sur quoi que ce soit dans le DATBase, les limites informatiques peuvent voler des informations). P>
Tout système financier qui utilise quoi que ce soit, à l'exception des PROC stockés par exemple, est complètement ouvert à une fraude interne, ce qui constitue une violation des contrôles internes qui devrait prévenir la fraude et ne passeraient pas un bon audit. p>