Warum möchten Sie Dynamic SQL in gespeicherten Prozeduren vermeiden?

13

Ich habe gehört, dass Sie Dynamic SQL nicht verwenden möchten. Können Sie ein konkretes oder reales Beispiel geben? Persönlich codiere ich es einige Male in meiner Datenbank. Ich denke, es ist in Ordnung, weil es Flexibilität ist. Meine Vermutung bezieht sich auf SQL Injection oder Performance. Noch etwas?

Richard Sayakanit
quelle

Antworten:

7

Es ist nichts Falsches daran, dynamisches SQL zu verwenden, wenn Sie müssen. In der Tat ist es unter bestimmten Umständen die einzige Option, die Sie haben. Es ist eher eine Empfehlung, es nicht zu verwenden, da es zu einer SQL-Injection führen kann, wenn Ihre Eingabe nicht bereinigt wird. Ja, die Verwendung von dynamischem SQL in Modulen, die häufig aufgerufen werden, kann sich nachteilig auf die Leistung auswirken.

Ich glaube nicht, dass es per se ein konkretes Beispiel gibt, aber ich würde Folgendes sagen: Versuchen Sie, das zu erreichen, was Sie sind, nachdem Sie zuerst regelmäßige Abfragen und Anweisungen verwendet haben - erst dann, wenn Sie alle anderen Möglichkeiten ausgeschöpft haben, tun Sie dies dynamisch. Denken Sie daran, dass die Ausführung einer dynamischen SQL-Zeichenfolge in einer separaten Benutzersitzung zu dem Modul erfolgt, das sie aufruft. Daher können Berechtigungsprobleme auftreten, bei denen Sie keine erwarten.

Wenn Sie sich Sorgen um die Leistung machen; Probier es aus. Wenn Sie sich Sorgen um die Sicherheit machen; Überprüfen Sie Ihre Eingabe. Es gibt kein Richtig oder Falsch - nur, dass Sie Ihr bestes Urteilsvermögen auf der Grundlage der Informationen und Tools verwenden, die Ihnen zu diesem Zeitpunkt zur Verfügung stehen.

Herr Brownstone
quelle
5

Dynamic SQL ist ein Werkzeug. Und als Werkzeug hat es einige Anwendungen - für administrative Arbeiten ist es zum Beispiel ein Segen.

Nicht so gut für SP, das von Anwendungen verwendet wird, insbesondere wenn Sie die Parametrisierung des generierten Codes nicht verwaltet haben (die neuesten Versionen von SQL Server haben die Probleme reduziert, sind aber weiterhin gültig).

Ich werde hier nicht näher darauf eingehen, daher empfehle ich einen ausgezeichneten Artikel zu Dynamic SQL-Problemen: Der Fluch und der Segen von Dynamic SQL von MVP Erland Sommarskog.

Fabricio Araujo
quelle
Ich wollte diesen Link auch teilen, er muss für jeden gelesen werden, der über die Verwendung von dynamischem SQL nachdenkt.
HLGEM
1

Es ist wie bei den meisten DBMS-Funktionen. Wenn Sie es in der richtigen Situation verwenden, funktioniert es gut, in der falschen Situation schlecht.

Vorteile: Manche Dinge können ohne sie einfach nicht gemacht werden. Normalerweise habe ich festgestellt, dass dies nur für Verwaltungsarbeiten und nicht für Anwendungscode gedacht ist. Bei einigen Systembefehlen können Parameter nicht als Eingabe verwendet werden. Wenn ich beispielsweise in vielen Fällen mit unbekannten Datenbanken für jede Datenbank etwas über einen Sproc ausführen muss und der Befehl keine Parameter akzeptiert, löse ich dies normalerweise über dynamisches SQL. Dies ist jedoch in Sybase ASE eher eine Sache als in MSSQL.

Nachteile: Ich werde nicht viel darauf eingehen, da ich denke, dass wir es alle bereits wissen, aber es kann ein gewisses Risiko für die SQL-Injection bestehen, wenn sie falsch verwendet wird. Das Größere für mich ist, dass die Abfrage so behandelt wird, wie sie ist, eine eindeutige Ad-hoc-Abfrage und nicht Teil des kompilierten Abfrageplans. Für etwas, das gelegentlich läuft, keine große Sache. Für etwas, das hunderte Male pro Minute ausgeführt wird und viele eindeutige SQL-Werte aufweist, werden viele neue, möglicherweise unnötige Abfragepläne generiert, die Zyklen verschlingen und die gültige Zeit des Plan-Cache verkürzen.

DBAmazinglyBadAtThis
quelle
Eine hervorragende Anwendung in Sybase ASE sind Pivots, ohne die zu pivotierenden Werte zu kennen. Dies kann mit dynamischem SQL in einem gespeicherten Prozess erfolgen, aber meines Wissens unterstützt Sybase ASE die Syntax nicht, dies direkt als Abfrage auszuführen. Erst wenn die Werte bekannt sind, kann die Abfrage geschrieben werden, um die Daten zu schwenken.
Richard Crossley
-7

Verwenden Sie kein dynamisches SQL.

In 99% der Fälle wird Dynamic SQL verwendet, da keine Kenntnisse über die Verwendung optionaler Parameter in gespeicherten Prozeduren vorhanden sind. In den restlichen 1% der Fälle wird eine hochkomplexe Abfrage für einen Bericht erstellt, den der Kunde nicht versteht sogar. Der Fluch und der Segen von Dynamic SQL zeigen kein Beispiel dafür, warum es eine gute Idee wäre, es zu verwenden, sondern legen lediglich nahe, dass es problematisch ist, da es die Komplexität beim Debuggen, Verwalten und ganz zu schweigen von den Sicherheitsrisiken von SQL erhöht Injection, schlechte Leistung, nicht weil der Cache, sondern die damit verbundenen schlechten Praktiken wie die Verwendung temporärer Tabellen und Cursor, die natürlich faul und naiv sindProgrammierer würde Missbrauch von. Es gibt keine Flexibilität, Abfragen auf diese Weise zu schreiben. SQL ist eine deklarative Sprache und sollte als solche behandelt werden.

Faulheit ist die Wurzel allen Übels.

Paradoxerweise wird diese Antwort zu den am schlechtesten bewerteten zählen .

Ivanzinho
quelle
Der Artikel bietet in der Tat mindestens ein Beispiel für einen idealen Anwendungsfall für dynamisches SQL, und "es gibt keine Flexibilität, Abfragen auf diese Weise zu schreiben ..." ist nicht wahr - dynamisches SQL ist genau das, was dies ermöglicht Flexibilität.
LowlyDBA
Optionale Parameter? Du meinst das Antimuster?
Forrest
@LowlyDBA Der Artikel bietet mindestens ein Beispiel: das einfachste SELECT, das jemals gesehen wurde. Welches komplexe Problem löst das? und für die Flexibilität, ja, für diese naiven Programmierer.
Ivanzinho
@Forrest warum nennst du es "Antipattern"? weil der Link, den Sie bereitgestellt haben, dies niemals sagt und auch nie zeigt, wie viel Verbesserung vorgenommen wurde, nachdem die Logik in ein dynamisches SQL umgeschrieben wurde (was in diesem Fall im Vergleich zu dem Schneeballeffekt der Aufrechterhaltung dieser Abfrage letztendlich unbedeutend wäre)
Ivanzinho
Dies ist meiner Meinung nach eine (schlechte) meinungsbasierte Antwort. Sie haben weder konkrete Beispiele für die Probleme angegeben, die Sie beschreiben, noch haben Sie die
Vorteile