Einige Beobachtungen
Gespeicherte Prozeduren ermöglichen die Wiederverwendung von Code und die Kapselung (zwei Säulen der Softwareentwicklung).
Nur wenn Sie sie in dem Kontext verwenden, in dem sie verwendet werden sollen. Dieselbe Behauptung kann über Funktionen (in strukturierter Programmierung) oder Methoden (in objektorientierter Programmierung) aufgestellt werden, und dennoch sehen wir 1K-Funktionen und mega-ass-Objekte.
Artefakte bieten Ihnen diese Vorteile nicht. Die richtige Verwendung dieser Artefakte ist der Grund für diese Vorteile.
Sicherheit (Sie können Berechtigungen für einen einzelnen gespeicherten Prozess erteilen / entziehen),
Ja. Dies ist ein guter Punkt und einer der Hauptgründe, warum ich gespeicherte Prozeduren mag. Sie bieten eine feinere Zugriffskontrolle als dies normalerweise nur mit Ansichten und Benutzerkonten möglich ist.
schützen Sie vor SQL-Injection-Angriffen,
Dies ist für SPs nicht spezifisch, da Sie mit parametrisierten SQL-Anweisungen und Eingabebereinigung das gleiche Schutzniveau erreichen können. Ich würde jedoch zusätzlich zu diesen SPs aus Gründen der "Sicherheit in der Tiefe" verwenden .
und helfen auch mit Geschwindigkeit (obwohl der DBA sagte, dass ab SQL Server 2008 sogar reguläre SQL-Abfragen kompiliert werden, wenn sie genügend oft ausgeführt werden).
Dies ist in hohem Maße herstellerspezifisch für Datenbanken, aber im Allgemeinen hat Ihr DBA Recht. SQL-Anweisungen (entweder statisch oder parametrisiert) werden kompiliert. SPs helfen, wenn Sie Daten aggregieren und berechnen möchten / müssen, die Sie nicht mit einfachen SQL-Anweisungen ausführen können, die jedoch eng in SQL integriert sind und für die kein Roundtrip zum App-Server erforderlich ist.
Ein gutes Beispiel ist das Abfragen von Daten in einen temporären Cursor (oder Cursor), von dem aus ein anderes SQL ausgeführt werden soll. Sie können dies programmgesteuert auf dem App-Server tun, oder Sie können die Mehrfach-Roundtrips speichern, indem Sie dies in der Datenbank tun.
Dies sollte jedoch nicht die Norm sein. Wenn Sie viele dieser Fälle haben, ist dies ein Zeichen für einen schlechten Datenbankentwurf (oder Sie beziehen Daten aus nicht so kompatiblen Datenbankschemata abteilungsübergreifend).
Wir entwickeln eine komplexe App unter Verwendung der Agile-Softwareentwicklungsmethode.
Agilität hat mit Software-Engineering-Prozessen und Anforderungsmanagement zu tun, nicht mit Technologien.
Kann sich jemand gute Gründe vorstellen, warum er gespeicherte Procs nicht verwenden möchte?
Falsche Frage
Die Frage ist falsch und entspricht der Frage "Gibt es gute Gründe, GOTO nicht zu verwenden?" Ich stehe mehr auf der Seite von Niklaus Wirth als auf der Seite von Dijkstra. Ich kann verstehen, woher Dijkstras Gefühl kam, aber ich glaube nicht, dass es in allen Fällen zu 100% zutreffend ist. Gleiches gilt für Store Procs und jegliche Technologie.
Ein Werkzeug ist gut, wenn es für den vorgesehenen Zweck gut verwendet wird und wenn es das beste Werkzeug für die jeweilige Aufgabe ist. Andernfalls bedeutet dies nicht, dass das Werkzeug falsch ist, der Benutzer jedoch nicht weiß, was er tut.
Die richtige Frage lautet: "Welche Art von Nutzungsmustern für gespeicherte Prozeduren sollte vermieden werden?" Oder "unter welchen Bedingungen sollte ich gespeicherte Prozeduren verwenden (oder nicht)" . Wenn Sie nach Gründen suchen , eine Technologie nicht zu verwenden, geben Sie dem Werkzeug einfach die Schuld, anstatt die technische Verantwortung genau dort zu platzieren, wo sie hingehört - beim Ingenieur.
Mit anderen Worten, es ist eine Ausrede oder eine Erklärung der Unwissenheit.
Ich vermute, dass die Datenbankadministratoren diese gespeicherten Prozesse nicht beibehalten wollten, aber es scheint zu viele Negative zu geben, um eine solche Entwurfsentscheidung zu rechtfertigen.
Sie projizieren dann die Ergebnisse ihrer schlechten technischen Entscheidungen auf die Werkzeuge, die sie schlecht eingesetzt haben.
Was ist in Ihrem Fall zu tun?
Meine Erfahrung ist, wenn ich in Rom bin, mache ich es wie die Römer .
Kämpfe nicht dagegen an. Wenn die Leute in Ihrem Unternehmen Geschäftsprozesse als schlechte Praxis bezeichnen möchten, lassen Sie sie. Beachten Sie jedoch, dass dies eine rote Fahne in ihren Entwicklungspraktiken sein kann.
Eine typische Kennzeichnung von Dingen als schlechte Praxis erfolgt normalerweise in Organisationen mit Tonnen von inkompetenten Programmierern. Indem die Organisation bestimmte Dinge auflistet, versucht sie, den Schaden zu begrenzen, der intern durch ihre eigene Inkompetenz verursacht wird. Ich scheiße dich nicht.
Verallgemeinerungen sind die Mutter aller Fehler. Zu sagen, dass gespeicherte Prozesse (oder jede Art von Technologie) eine schlechte Praxis sind, ist eine Verallgemeinerung. Verallgemeinerungen sind Ausreden für Inkompetente. Ingenieure arbeiten nicht mit offensichtlichen Verallgemeinerungen. Sie analysieren von Fall zu Fall, analysieren Kompromisse und treffen technische Entscheidungen und Lösungen gemäß den vorliegenden Fakten, in deren Kontext sie ein Problem lösen sollen.
Gute Ingenieure bezeichnen Dinge nicht so verallgemeinernd als schlechte Praxis. Sie sehen sich das Problem an, wählen das geeignete Werkzeug aus und machen Kompromisse. Mit anderen Worten, sie machen Engineering.
Meine Meinung, wie man sie nicht benutzt
Setzen Sie komplexe Logik nicht über das Sammeln von Daten (und möglicherweise einige Transformationen) hinaus ein. Es ist in Ordnung, Datenmassagelogik in diese zu integrieren oder das Ergebnis mehrerer Abfragen mit diesen zu aggregieren. Aber das war es schon. Alles darüber hinaus würde sich als Geschäftslogik qualifizieren, die sich woanders befinden sollte.
Verwenden Sie sie nicht als einzigen Schutzmechanismus gegen SQL-Injection. Sie lassen sie dort, falls etwas Schlimmes für sie zutrifft , aber es sollte eine Menge defensiver Logik vor ihnen stehen - clientseitige Validierung / Bereinigung, serverseitige Validierung / Bereinigung, möglicherweise Umwandlung in Typen, die für Sie sinnvoll sind Domänenmodell und schließlich an parametrisierte Anweisungen übergeben werden (dies können parametrisierte SQL-Anweisungen oder parametrisierte gespeicherte Prozesse sein).
Machen Sie Datenbanken nicht zum einzigen Ort, an dem sich Ihre Geschäftsprozesse befinden. Ihre Geschäftsprozesse sollten genauso behandelt werden, wie Sie Ihren C # - oder Java-Quellcode behandeln. Das heißt, die Quellcodeverwaltung steuert die Textdefinition Ihrer Geschäftsprozesse. Die Leute schimpfen darüber, dass Geschäftsprozesse nicht von der Quelle kontrolliert werden können - Bullcrap, sie wissen einfach nicht, wovon zum Teufel sie reden.
Meine Meinung, wie / wo man sie benutzt
Ihre Anwendung erfordert Daten, die aus mehreren Abfragen oder Ansichten transponiert oder aggregiert werden müssen. Sie können das von der Anwendung in die Datenbank auslagern. Hier haben Sie eine Performance - Analyse zu tun , da a) Datenbank - Engines effizienter ist , dass App - Server in diese Dinge zu tun, aber b) App - Server sind (manchmal) leichter horizontal zu skalieren.
Feinkörnige Zugangskontrolle. Sie möchten nicht, dass ein Idiot kartesische Joins in Ihrer Datenbank ausführt, aber Sie können auch nicht einfach Leuten verbieten, beliebige SQL-Anweisungen einfach so auszuführen. Eine typische Lösung besteht darin, beliebige SQL-Anweisungen in Entwicklungs- und UAT-Umgebungen zuzulassen und sie in System- und Produktionsumgebungen zu verbieten. Jede Aussage, die es zu systest oder zur Produktion schaffen muss, geht in eine Speicherprozedur, die sowohl von Entwicklern als auch von dbas mit Code überprüft wird.
Jeder gültige Bedarf, eine SQL-Anweisung auszuführen, die sich nicht in einem Geschäftsprozess befindet, durchläuft einen anderen Benutzernamen / Konto und Verbindungspool (wobei die Verwendung stark überwacht wird und davon abgeraten wird.)
- In Systemen wie Oracle können Sie auf LDAP zugreifen oder Symlinks zu externen Datenbanken erstellen (z. B. durch Aufrufen eines Geschäftsprozesses auf der Datenbank eines Geschäftspartners über VPN). Einfache Möglichkeit, Spaghetti-Code zu erstellen. Dies gilt jedoch für alle Programmierparadigmen und manchmal auch Sie haben spezielle Geschäfts- / Umgebungsanforderungen, für die dies die einzige Lösung ist. Mit Store Procs können Sie diese Unangenehmkeit an einem einzigen Ort in der Nähe der Daten zusammenfassen, ohne den App-Server durchsuchen zu müssen.
Ob Sie dies auf der Datenbank als Store Proc oder auf Ihrem App-Server ausführen, hängt von der Abwägungsanalyse ab, die Sie als Ingenieur durchführen müssen. Beide Optionen müssen analysiert und mit einer Art Analyse begründet werden. Auf die eine oder andere Weise die andere Alternative einfach als "schlechte Praxis" zu beschuldigen, das ist nur eine lahme Auseinandersetzung mit der Technik.
- In Situationen, in denen Sie Ihren App-Server einfach nicht skalieren können (z. B. kein Budget für neue Hardware oder Cloud-Instanzen), aber über ausreichend Kapazität im Datenbank-Back-End verfügen (dies ist typischer, als viele zugeben möchten), zahlt es sich aus Geschäftslogik zu verschieben, um procs zu speichern. Nicht hübsch und kann zu anämischen Domainmodellen führen ... aber andererseits ... Kompromissanalyse, die Sache, an der die meisten Software-Hacks scheißen.
Ob dies nun zu einer dauerhaften Lösung wird oder nicht, das ist spezifisch für die in diesem bestimmten Moment beobachteten Einschränkungen.
Ich hoffe es hilft.