2016-01-22 4 views
9

Die Funktionalität, die in dieser Frage besprochen wurde, besteht darin, das angegebene SQL-Skript auszuführen. Der Inhalt des Skripts soll vom Benutzer während der Anwendungslaufzeit definiert werden. Das Skript kann sein, ob eine INSERT Anweisung oder eine Sequenz von komplexen PL/SQL Anweisungen. Da die zur Laufzeit verfügbare Eingabe (eventuell als String-Instanz) über Java ausgeführt werden sollte.Allgemeiner Ansatz für die SQL-Skriptausführung in Java

Der aktuelle Ansatz umschließt die Benutzereingabe mit einer PreparedStatement und führt sie aus. Diese Lösung funktioniert für die vorhandenen Testfälle. Das Hauptanliegen besteht darin, die volle Funktionalität der verwendeten Datenbank bereitzustellen, die möglicherweise nicht durch Tests abgedeckt ist, d. H. Eine Lösung, die der Übergabe des gleichen Benutzer-SQL-Skripts an die vom Datenbankanbieter bereitgestellte Konsole am nächsten kommt.

Ich frage mich, gibt es irgendwelche nicht vorgesehenen Einschränkungen in der aktuellen Ansatz mit PreparedStatement? Gibt es einen besseren allgemeinen Ansatz für die SQL-Skriptausführung über Java?

+0

Was genau versuchen Sie zu tun? Möchtest du einfach alles ausführen, versuchst du etwas wie http://sqlfiddle.com/ zu erstellen? –

+1

Sind Sicherheitslücken ein Problem? Sind angemessene Einschränkungen vorhanden, um zu verhindern, dass das Skript etwas potenziell Unerwünschtes oder Gefährliches tut? (Z. B. über die Benutzerrechte in der Datenbank?) –

+0

@SteveChambers gibt es keine Schwachstellen Bedenken, da Benutzer seine eigene Datenbank ändert und voll verantwortlich dafür ist. Das Hauptanliegen besteht darin, die volle Funktionalität der Datenbank auf die effizienteste Weise bereitzustellen. –

Antwort

4

Nun, das ist ein breites Design Frage, aber ich denke, dass es mehrere Schritte, die getan werden könnte:

  • SQL-Skript-Analyse und Erkennung: Sie müssen, welche Art von SQL erkennen zu können, Skript, das Sie haben: PL/SQL, DML, DDL, CDL, TCL, multipart getrennt durch ";" etc.
  • Statement Gebäude: Für jede Art von SQL-Skript müssen Sie in der Lage sein, die Anweisung mit Java auszuführen.
  • Parsing das Ergebnis. Sie müssen in der Lage sein, die in SELECTs zurückgegebenen und optional von Funktionen zurückgegebenen Parameter oder die Anzahl betroffener/eingefügter Zeilen zu sammeln.
  • Fehlerbehandlung: Sie müssen in der Lage sein zu berichten, was mit dem SQL-Skript passiert ist, wenn die Dinge nicht wie erwartet funktionierten.

Bitte beachten Sie:

  • Dies scheint, wie die Programmierung eines SQL Client. Wenn nicht, bitte erklären Sie, was Sie tun möchten. Verwenden Sie dies nicht als Verbindungsebene in einer normalen Anwendung. Es wird extrem ineffizient und anfällig für SQL-Injektionen (Es ist viel komplizierter als nur scaping Kommas)
  • Sie möchten Funktionen aufrufen oder Abfragen mit externen Parametern ausführen.
  • Dies beinhaltet nicht die Benutzerschnittstellen Funktionen wie Syntax Highlighting. Parameter-Schnittstellen, etc ...
+0

Das Update der Frage durchgeführt, @borjab Bitte beachten Sie die neue Version der Frage –

+0

Ich baute ein [Open-Source-Projekt] (https://github.com/jonheller1/plsql_lexer), das mit vielen der oben genannten Schritte helfen könnte. Es kann Anweisungen ähnlich wie SQL \ * Plus aufteilen, Anweisungen klassifizieren, damit Sie wissen, was Sie damit tun können, unnötige Semikola entfernen (einige Anweisungen benötigen sie und andere nicht) und eine Rückmeldung ähnlich SQL \ * Plus (z "5 Zeilen zusammengeführt." Für eine MERGE-Anweisung). Es ist alles in PL/SQL, aber es sollte möglich sein, es von Java aus aufzurufen. –

0

Die erste Einschränkung von PreparedStatement in den Sinn kommt - Sie werden nicht in der Lage sein, einen OUT Parameter (n) einer gespeicherten Prozedur zu registrieren, können Sie möchten in CallableStatement Schnittstelle suchen .

Verwandte Themen