Frage

Wir sind dabei, ein neues Framework und eine neue Geschäftsmethode für unsere neuen internen Apps einzurichten.Unser aktuelles Design schreibt vor, dass die gesamte Sicherheitslogik von unserer Datenbank verwaltet werden sollte und dass alle Informationen (und ich meine alle) über gespeicherte Prozeduren in die Datenbank ein- und ausgehen.

Die Theorie besagt, dass die Datenzugriffsschicht Informationen von einer gespeicherten Prozedur anfordert und die Authentifizierung an die Datenbank übergibt.Die Datenbank bestimmt die Rolle/Berechtigungen des Benutzers und entscheidet, ob die Aufgabe ausgeführt wird (sei es das Abrufen von Daten oder das Durchführen einer Aktualisierung).

Ich denke, das bedeutet weniger Datenbanktransaktionen.Ein Aufruf der Datenbank.Wenn sich die Sicherheit in unserer Datenzugriffsschicht befände, wäre ein Datenbankaufruf erforderlich, um festzustellen, ob der Benutzer über die entsprechenden Berechtigungen verfügt, und dann ein separater Datenbankaufruf, um die Aktion auszuführen.

Ich persönlich finde, dass das SQL Management Studio als IDE völlig fehlt.Meine Hauptsorge besteht darin, dass wir am Ende eine ziemlich große Menge an Geschäftslogik in unseren gespeicherten Prozeduren beibehalten müssen, um nur minimale Leistungssteigerungen zu erzielen.

Im Moment verwenden wir LINQ für unser ORM.Es scheint leicht und schnell zu sein, aber das Beste ist, dass es sich wirklich schnell entwickeln lässt.

Sind die Wartungskosten den Leistungsgewinn wert?Machen wir uns etwas vor und glauben, dass es überhaupt einen spürbaren Leistungszuwachs geben wird?Oder machen wir uns nur einen Albtraum?

Unsere Umwelt:

  • Interne, nicht geschäftskritische Geschäftsanwendungen
  • C#/ASP.NET 3.5
  • Windows 2003
  • MS SQL Server 2005
  • 35 mittelgroße Web-Apps mit ca. 500 Benutzern
War es hilfreich?

Lösung

Tun Sie das nicht, dass . Wir hatten vor kurzem eine VERY BAD Erfahrung, wenn der „Datenbank-Guru“ an ein anderes Unternehmen entschieden. Die Wartung aller Logik in den Verfahren sind einfach schrecklich !!

Ja, Sie gehen einige Performance-Verbesserung haben, aber das ist es nicht wert. In der Tat ist die Leistung nicht einmal ein großes Anliegen in interner Anwendung. Investiert mehr Geld in guten Servern. Es wird sich auszahlen.

Andere Tipps

Leider gibt es keine „einzig wahre Antwort“. Die Wahl, die Sie müssen, hängt von mehreren Faktoren machen, wie:

  • Die Vertrautheit des Teams mit den angegebenen Lösungen (dh, wenn die Mehrheit von ihnen komfortables Schreiben von SQL ist, kann es in der Datenbank sein, aber wenn die Mehrheit von ihnen wohler mit C # ist, sollte es in dem Code sein)
  • Die "politische Macht" jede Partei
  • etc

Es gibt keinen entscheidenden Vorteil in jede Richtung (wie Sie Performance-Gewinne, sagte minimal sind), die eine Sache im Auge zu behalten ist die DRY (Do Repeat Yourself nicht) Prinzip: Sie reimplementieren nicht die Funktionalität zweimal (in der Code und im DB), weil sie synchron zu halten wird ein Alptraum. Wählen Sie eine Lösung und auch daran halten.

Sie könnten es tun, aber es ist ein großer Schmerz zu entwickeln, gegen und pflegen. Nehmen Sie es von jemandem, der an einem Projekt, wo fast alle Business-Logik in gespeicherten Prozeduren codiert.

Zur Sicherheit hat ASP.NET Benutzer- und Rollenverwaltung hinein gebrannt, so können Sie Ausflüge in die Datenbank gespart werden, aber so was? Im Gegenzug wird es weit mehr lästig und Debug-System und Validierungsfehler zu handhaben, da sie aus der Datenbank zu sprudeln haben.

Unit-Tests sind weit schwieriger, da die Gerüste für Unit-Tests sprocs verfügbar sind weit weniger entwickelt.

Die richtige oop und Domain-Driven Design ist alles, aber aus dem Fenster.

Und die Performance-Gewinn ist, wenn eine winzige sein würde. Wir sprachen über dieses hier .

Ich würde empfehlen, dass, wenn Sie Ihre geistige Gesundheit als Entwickler speichern verbissen kämpfen nur die Datenbank als Persistenz-Schicht zu halten

IMHO:

Anwendungsdienst-Stufe -> Anwendungslogik und Validierung
Anwendungsdatenebene -> Datenlogik und Sicherheit
Datenbank -> Datenkonsistenz

Sie werden eher von dem sproc Ansatz gebissen werden oder später, ich habe dies auf die harte Tour gelernt.
Procs sind groß für einen Schuss Operationen, die viel Leistung benötigen, aber die CRUD Teil ist die Datenebenen Job

Stored Procedures ist in der Regel ein Gewinn für die Sicherheit. Die Vereinfachung der Beziehung zwischen der Anwendung und der Datenbank die Anzahl der Stellen reduziert, wo Sie Fehler haben kann; Fehler im Code, die Business-Logik in dem Datenbank-Schnittstellen sind in der Regel Sicherheitsprobleme sein. Also, Ihr DBA ist nicht falsch, über die Dinge nach unten, um gespeicherte Prozeduren zu verriegeln.

Ein weiterer Vorteil der Anwendung Sperren, um gespeicherte Prozeduren, ist, dass die Datenbankverbindung App-Stack kann seine Privilegien anders auf bestimmte Stored Procedure Calls und nichts gesperrt.

Ein Vorteil einen DBA mit für Ihre Anwendung in Sicherheitslogik beteiligt ist, dass die verschiedenen App-Funktionen und Rollen können Ansichten in der Datenbank nach unten aufgeteilt werden, so dass auch bei dynamischen SQL und generischen select-Anweisungen nötig sind, um die Schäden, die aus eine SQL-Schwachstelle eingeschränkt werden kann.

Die Kehrseite davon ist, natürlich, verloren Flexibilität. Ein ORM wird sich offensichtlich schneller sein als eine konstante Verhandlung mit einem DBA über Parameter für gespeicherte Prozeduren zu entwickeln. Und, wie der Druck auf die gespeicherten Prozeduren wächst, dann ist es immer wahrscheinlicher, dass die Verfahren sich auf dynamische SQL zurückgreifen wird, die genauso anfällig sein wird als App zusammengesetzt SQL angreifen.

Es gibt einen goldenen Mittelweg hier, und Sie sollten versuchen, es zu finden. Ich habe vor kurzem an Projekten gearbeitet, die von ziemlich schrecklich SQL-Injection-Probleme gerettet wurden, weil ein DBA sorgfältig die Datenbank konfiguriert hatte, seine Verbindungen und seine gespeicherten Prozeduren für „Least Privilege“, so dass jeder eine Datenbank Benutzer Zugriff hatte nur auf das, was sie musste wissen.

Natürlich, wie Sie SQL-Code in Ihrer Anwendung Logik schreiben, stellen Sie sicher, dass Sie laufend parametrisierte Prepared Statements, dass Sie Ihre Eingabe sind desinfizierende, dass Sie von internationalisierten Eingang achtsam sind (es gibt viele, viele Möglichkeiten Single-Zitat über HTTP zu sagen), und dass Sie darauf achten, wie Sie Ihre Datenbank verhält, wenn Eingaben zu groß sind für Spaltenbreiten.

Es hängt alles von Ihrem Fall ist es wahrscheinlich besser ist, nicht den SP Weg zu gehen und alles tun, den DDD Weg (ein Domain-Modell in Code auszuführen und zu verwenden, dass).

Wenn Sie jedoch eine Datenbank haben, die nicht nur von der Anwendung verwendet wird, sondern von vielen, dann sollten Sie wahrscheinlich Web-Service in Betracht ziehen. Auf jedem Fall sollte die Datenbank nur über eine Schicht zugänglich sein, die die Geschäftsregeln sonst erzwingen Sie gehen mit „schmutzigen“ Daten am Ende und Ihre Daten danach Hygienisierung sind ein viel größeren Schmerzen als vorher einige Geschäftsregeln zu schreiben. Eine gute Datenbank sollte Check-Einschränkungen haben und Indizes gesetzt, so wird es einige Geschäftsregeln, ob es Ihnen gefällt oder nicht.

Und wenn Sie mit Millionen und Milliarden von Datensätzen zu tun haben, werden Sie glücklich sein, einen guten DB-Typ zu haben, die das Problem für Sie löst.

Meine Meinung ist, dass die Anwendung selbst die Authentifizierung und Autorisierung behandeln soll. Auf der Datenbank Seite sollten Sie nur die Verschlüsselung von Daten handhaben, wie benötigt werden.

Ich habe gespeicherte Prozedur basierte Anwendungen in der Vergangenheit gebaut. In Ihrem Fall gibt es vielleicht eine Möglichkeit Authentifizierung bei der Datenbank-Ebene zu halten und Ihre Geschäftslogik in C #. Verwenden Ansichten Daten zu begrenzen (Sie sehen nur die Zeilen, die Sie Berechtigung müssen). Diese Ansichten können mit der gleichen Leichtigkeit wie Tabellen in LINQ verwendet werden. Sie setzen Ihr Updates mit gespeicherten Prozeduren geschehen.

Dies ermöglicht Linq, Business-Logik in C # und eine gemeinsame Authentifizierungs-Ebene in der Datenbank, den Zugriff auf die Daten steuert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top