Warum verwenden Leute keine gespeicherten Prozeduren in Websites, die auf Datenbanken zugreifen?

577
WGroleau

Wenn Sie in SQL-Systemen, die gespeicherte Prozeduren unterstützen, bestimmte Funktionen nicht verwenden, wird der Sproc häufig in kompilierter und optimierter Form auf dem Server gespeichert. Wenn der SQL-Text als Zeichenfolge in PHP oder einer anderen Webseite eingebettet / erstellt wird, muss der Text vor der Ausführung an die DB gesendet und kompiliert werden. Dies ist nicht nur in der Datenbank weniger effizient, es führt dazu, dass der PHP-Interpreter (oder was auch immer) vor dem Senden mehr Arbeit erledigt und der Webserver mehr Arbeit beim Abrufen der größeren Seite leistet. Ich wundere mich daher, warum ich noch nie gespeicherte Prozeduren gesehen habe, die in einer der zahlreichen großen Open-Source-Web-Apps, die ich mir angesehen habe, verwendet wurden, nicht einmal einige, die NUR mySQL oder MS SQL Server unterstützen (beide verfügen über gespeicherte Prozeduren).

0
Es gibt Positiven und Negativen für die Verwendung einer gespeicherten Prozedur. Die Leute, die sie nicht verwenden, haben entweder einen bestimmten Grund, sie nicht zu verwenden, oder sie glauben, dass ihre Negative ihre Positiven überwiegen. Ich habe ein paar Dutzend Gründe, warum ich in meinen eigenen Projekten, die über ein Datenbank-Backend verfügen, keine Speicherprozeduren verwende. Ramhound vor 7 Jahren 1
Wenn Sie die Antwort von @ Ramhound hinzufügen, erhalten Sie, wenn Sie 3 Entwickler fragen, 4 Antworten. Einige Gründe sind jedoch häufiger: Wenn Sie gespeicherte Prozeduren verwenden, müssen Sie die Geschäftslogik in der Datenbank ablegen, und es ist schwieriger, gespeicherte Prozeduren mit der restlichen Version unter Versionskontrolle zu verwalten Code-Assets im Projekt. Atzmon vor 7 Jahren 2
"Wenn der SQL-Text als String in PHP eingebettet / erstellt wird" und wie wäre dies bei der Verwendung einer gespeicherten Prozedur nicht erforderlich? Die gleichen Parameter sind noch erforderlich. Sie benötigen noch einen SQL-Befehl, um den SP aufzurufen. Die Datenmenge wird natürlich auch genau gleich sein. Sie können nicht einfach auf magische Weise Komplexität erzeugen oder Daten verschwinden lassen. Daniel B vor 7 Jahren 0
Diese "Debatte" tobt seit jeher und wird niemals aufhören. ;) Lesen Sie diesen Coding-Horror-Eintrag von 2005: [Gespeicherte Prozeduren vs. Ad-hoc-SQL] (https://blog.codinghorror.com/stored-procedures-vs-ad-hoc-sql/), um einige gute Informationen zu erhalten kann deine eigene Entscheidung treffen. :) Ƭᴇcʜιᴇ007 vor 7 Jahren 1
@DanielB: Wenn Sie eine gespeicherte Prozedur verwenden, müssen Sie NUR die Parameter übergeben. Auf der anderen Seite müssen Sie die gesamte SQL zusammenstellen, die Syntax richtig einstellen, die SQL-Injection verhindern, und dann muss der DB-Server kompiliert und optimiert werden. WGroleau vor 7 Jahren 0
@WGroleau Bei einer ordnungsgemäß vorbereiteten Anweisung "übergeben" Sie auch nur die Parameter. Die Abfrage ist statisch. SQL-Injection ist auch nicht möglich. Der Server kann die vorbereitete Anweisung zwischenspeichern. SPs für diesen Zweck sind wirklich wie das Extrahieren einer Methode. Ich verstehe, warum Sie SPs verwenden würden, wenn Endbenutzer direkten Datenbankzugriff haben. Aber ich verstehe nicht, warum jemand das zulassen würde. Daniel B vor 7 Jahren 0
Natürlich erlaube ich den Benutzern nicht, ihre eigenen Sprocs zu schreiben, genauso wenig wie ich es ihnen erlauben würde, meine PHP-Datei zu modifizieren! Und es macht keinen Sinn, eine Anweisung im Cache zu speichern, wenn man davon ausgeht, dass der nächste Benutzer die gleichen Einträge vornimmt. WGroleau vor 7 Jahren 0

2 Antworten auf die Frage

1
Anonymous

Gespeicherte Prozeduren sperren Sie in einer bestimmten DB-Plattform. Beispielsweise wird Code, der für MySQL geschrieben wurde, nicht sofort auf SQL Server ausgeführt. Das macht Ihre Anwendung weniger portabel. Natürlich geht es um mehr: Die Erreichung der Portabilität würde auch die Verwendung von Standarddatentypen erfordern und nicht auf plattformspezifische Funktionen angewiesen sein. Was in der Praxis nicht immer der Fall ist.

Meines Wissens war mein SQL portabel - obwohl ich es niemals auf einer anderen Plattform ausprobieren durfte. Ich habe jedoch nie einen der Nachteile gesehen, die in diesem Artikel zum Thema "Coding-Horror" vermutet werden. Außerdem ist es viel einfacher, SQL in der Datenbank zu schreiben und zu testen als in kleinen Teilen, die von einer anderen Sprache verkettet werden. Einmal geschrieben, ist es viel einfacher, einen Aufruf in PHP oder ASPX einzufügen, als die gesamte SQL darin zu bearbeiten. WGroleau vor 7 Jahren 0
0
TTT

Wenn die Apps mehrere Datenbanken unterstützen, ist es vorstellbar, dass sie für jede unterstützte Datenbank Store-Prozeduren schreiben.

Nun, ich weiß es nicht für SQL Server, aber in Bezug auf MySQL erlauben viele Shared Hostings die Erstellung von gespeicherten Prozeduren überhaupt nicht, und einige andere Funktionen.

Ich habe nicht gesagt, mehrere DBs zu unterstützen. Ich sagte, dass ich nur MySQL _OR_ MSSQL unterstütze. WGroleau vor 7 Jahren 0
Ich habe recht, Entschuldigung, Sie haben das nicht genau gesagt, obwohl sie auch nicht von Ihnen ausgeschlossen werden. Ich entferne diese falsche Erwähnung aus meiner Antwort. TTT vor 7 Jahren 0
Aber diese beiden tun es, und ich habe noch nie Sprocs gesehen, die in Code verwendet wurden, den ich nicht geschrieben habe, obwohl sie eindeutig sagten, dass einer von ihnen erforderlich war. Da mir ansonsten kein glaubwürdiger Grund angeboten wurde, würde ich keinen Server verwenden, der keine gespeicherten Prozeduren hatte. WGroleau vor 7 Jahren 0