Question

Nous sommes dans le processus de mise en place d'un nouveau cadre et de la façon de faire des affaires pour nos nouvelles applications internes.Notre conception actuelle stipule que tous les services de sécurité de la logique devrait être géré par notre base de données, et toutes les informations (et je dis bien tous) va dans et hors de la base de données, via des procédures stockées.

La théorie est que la couche d'accès aux données des demandes d'info à partir d'une procédure stockée et passe au-dessus de l'authentification à la base de données.La base de données détermine le rôle de l'utilisateur/les autorisations et décide si oui ou non pour effectuer la tâche (qu'il s'agisse de la récupération des données ou de faire une mise à jour).

Je suppose que cela signifie moins de transactions de base de données.Un appel à la base de données.Si la sécurité est notre couche d'accès aux données, cela nécessiterait 1 à la base de données pour déterminer si l'utilisateur a des autorisations appropriées, puis 1 séparé à la base de données pour effectuer l'action.

Je trouve le SQL server Management studio complètement en manque comme une IDE.Ma principale préoccupation est que nous allons finir par avoir à maintenir une certaine mauvaise montant de la logique métier dans nos procédures stockées pour certains très peu de gains de performance.

Droit maintenant, nous sommes à l'utilisation de LINQ pour notre ORM.Il semble léger et rapide, mais le meilleur de tous, il est vraiment facile de développer rapidement dans.

Est le coût de la maintenance en valeur le gain de performance?Sommes-nous tromper nous-mêmes en pensant qu'il n'y aura même un notable gain de performance?Ou sommes-nous juste de faire un cauchemar pour nous-mêmes?

Notre environnement:

  • Interne, non-essentielles à la mission des applications d'entreprise
  • C#/ASP.NET 3.5
  • Windows 2003
  • MS SQL Server 2005
  • 35 Moyennes applications web avec environ 500 utilisateurs
Était-ce utile?

La solution

Ne pas le faire.Nous avons récemment eu un TRÈS MAUVAIS l'expérience lorsque la base de données "gourou" a décidé d'aller à une autre société.L'entretien de l'ensemble de la logique dans les procédures sont juste horrible!!!!

Oui, vous allez avoir une amélioration des performances, mais c'est pas la peine.En fait, la performance n'est même pas un gros souci dans l'application interne.Investir plus d'argent dans les bons serveurs.Ça paye.

Autres conseils

Malheureusement, il n'existe pas de "bonne réponse".Le choix que vous devez faire dépend de plusieurs facteurs, comme:

  • La familiarité de l'équipe avec les solutions (c'est à dire si une majorité d'entre eux est à l'aise pour écrire de SQL, il peut être dans la base de données, cependant, si une majorité d'entre eux est plus à l'aise avec le C#, il doit être dans le code)
  • Le "pouvoir politique" de chaque partie
  • etc

Il n'y a pas d'avantage décisif dans n'importe quelle direction (comme vous l'avez dit des gains de performances sont minimes), la seule chose à garder à l'esprit est le DRY (Don't Repeat Yourself) principe:ne pas reproduire la fonctionnalité de deux fois (dans le code et dans la DB), parce que leur maintien dans le synch sera un cauchemar.Choisir une solution et de s'y tenir.

Vous pourriez le faire, mais c'est un immense douleur de développer des contre et à entretenir.Prendre de quelqu'un qui est sur un projet où presque toute la logique métier est codé dans les procédures stockées.

Pour la sécurité, ASP.NET a l'utilisateur et le rôle de la gestion de boulangerie en elle de sorte que vous pourriez économiser des voyages à la base de données mais alors quoi?En échange, il devient de plus ennuyeux à manipuler et système de débogage et de validation des erreurs parce qu'ils ont à faire des bulles en place de la base de données.

Le test unitaire est beaucoup plus difficile depuis les de cadres disponibles pour les tests unitaires sprocs sont beaucoup moins développées.

Bon poo et domain driven design est tout, mais par la fenêtre.

Et le gain de performance va être minuscule, le cas échéant.Nous avons parlé de cette ici.

Je recommande que si vous voulez sauver votre santé mentale en tant que développeur, vous battre bec et ongles pour garder la base de données de la couche de persistance seulement

Mon humble avis:

Application de service de niveau -> logique de l'application et de validation
Application de la couche de données -> données de la logique et de la sécurité
Base de données -> la cohérence des données

Vous serez mordu par la procédure stockée approche tôt ou tard, j'ai appris cela à la dure.
Procs sont grands pour des opérations ponctuelles qui ont besoin de beaucoup de performance, mais le CRUD est la partie de données de niveaux d'emploi

Les procédures stockées sont habituellement une victoire pour la sécurité.La simplification de la relation entre votre application et la base de données réduit le nombre d'endroits où vous pouvez avoir des erreurs;des erreurs dans le code que les interfaces de la logique métier à la base de données ont tendance à être des problèmes de sécurité.Donc, votre DBA n'est pas faux sur le verrouillage de choses pour les procédures stockées.

Un autre avantage pour le verrouillage de l'application des procédures stockées est que l'application de la pile de la connexion de base de données peut avoir ses privilèges verrouillée pour des appels de procédures stockées et rien d'autre.

Un avantage à avoir un DBA impliqués dans la sécurité logique de votre application, c'est que les différentes fonctions de l'application et les rôles peuvent être partitionnées dans la base de données en bas de vues, de sorte que même si le SQL dynamique et générique sélectionnez déclarations sont nécessaires, les dégâts causés par un SQL vulnérabilité peut être limité.

Le revers de la médaille est, bien sûr, la perte de flexibilité.Un ORM est évidemment va être plus rapide à développer pour qu'une constante négociation avec l'administrateur de base de données de plus de paramètres de procédure stockée.Et, comme la pression sur les procédures stockées augmente, il est de plus en plus probable que les procédures elles-mêmes de recourir à du SQL dynamique, qui sera tout aussi vulnérables que d'application composé de SQL à l'attaque.

Il y a un heureux compromis ici, et vous devriez essayer de le trouver.J'ai travaillé sur des projets récemment qui ont été enregistrés à partir d'assez terrible injection SQL, car un DBA avait soigneusement configuré la base de données, ses connexions et ses procédures stockées pour "moindre privilège", afin qu'un utilisateur de base de données n'avaient accès qu'à ce qu'ils ont besoin de savoir.

Évidemment, comme vous l'écrivez du code SQL dans votre logique d'application, assurez-vous que vous êtes constamment paramétrée à l'aide de déclarations préparées à l'avance, que vous êtes à la désinfection de vos commentaires, que vous êtes conscient de l'internationalisation de l'entrée (il y en a beaucoup, beaucoup de manières de dire unique-devis sur HTTP), et que vous êtes conscient de la façon dont votre base de données se comporte lorsque les entrées sont trop grands pour les largeurs de colonne.

Tout dépend de votre cas, il est probablement mieux de ne pas aller le SP de l'itinéraire et de faire tout le DDD moyen (en faire un modèle de Domaine dans le code et l'utiliser).

Toutefois, si vous avez une base de données qui n'est pas seulement utilisé par votre application, mais par beaucoup, alors vous devriez probablement envisager de services web.En quelque sorte, la base de données ne doit être accessible via une couche qui applique les règles de gestion que vous allez jusqu'à la fin avec "sale" des données et de la désinfection de vos données par la suite est beaucoup plus de douleur que d'écrire quelques règles à l'avance.Une bonne base de données doit avoir vérifier les contraintes et les index ensemble, alors il aura certaines règles de gestion que vous le vouliez ou non.

Et si vous avez à traiter avec des millions et des milliards d'enregistrements, vous serez heureux d'avoir une bonne DB-guy qui résout le problème pour vous.

Mon avis est que l'application elle-même doit gérer l'authentification et l'autorisation.Sur la base de données côté, vous ne devez gérer le cryptage des données selon le besoin.

J'ai construit procédure stockée en fonction des applications dans le passé.Dans votre cas, il y a peut-être une façon de garder l'authentification à la base de données de la couche et de votre logique métier en C#.Utiliser des vues pour limiter la quantité de données (vous ne voyez que les lignes que vous avez l'autorité pour).Ces vues peuvent être utilisés dans de LINQ avec la même facilité que les tables.Vous définissez vos mises à jour à arriver avec des procédures stockées.

Cela permet de linq, la logique d'affaires en C#, et une couche d'authentification dans la base de données qui contrôle l'accès aux données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top