2016-01-22 16 views
9

La funzionalità discussa in questa domanda è eseguire lo script SQL specificato. Il contenuto dello script è destinato a essere definito dall'utente durante il runtime dell'applicazione. Lo script può essere una dichiarazione INSERT o una sequenza di istruzioni complesse PL/SQL. Poiché l'input disponibile durante il runtime (eventualmente come istanza di String) deve essere eseguito tramite Java.Approccio generale per l'esecuzione di script SQL in Java

L'approccio attuale prevede di inserire l'input dell'utente con un PreparedStatement e di eseguirlo. Questa soluzione funziona per i casi di test esistenti. La preoccupazione principale è fornire la piena funzionalità del database utilizzato che potrebbe non essere coperto dai test, ovvero la soluzione più vicina a passare lo stesso script SQL dell'utente nella console fornita dal fornitore del database.

Mi chiedo se non ci siano limitazioni previste nell'approccio corrente con PreparedStatement? Esiste un migliore approccio generale per l'esecuzione di script SQL tramite Java?

+0

Che cosa stai cercando di fare esattamente? Vuoi semplicemente eseguire tutto, stai cercando di creare qualcosa come http://sqlfiddle.com/? –

+1

Le vulnerabilità di sicurezza sono una preoccupazione qui? Esistono restrizioni adeguate per impedire alla sceneggiatura di fare qualcosa di potenzialmente indesiderato o pericoloso? (Ad es. Tramite i privilegi dell'utente nel database?) –

+0

@SteveChambers non ci sono problemi di vulnerabilità, poiché l'utente modifica il proprio database e ne è pienamente responsabile. La preoccupazione principale è fornire la funzionalità completa del database nel modo più efficiente. –

risposta

4

Bene, questa è una grande domanda di design, ma credo che ci sono diversi passaggi che si potrebbero fare:

  • SQL analisi sceneggiatura e il riconoscimento: È necessario essere in grado di rilevare il tipo di SQL script hai: PL/SQL, DML, DDL, CDL, TCL, multipart separati da ";" ecc.
  • Creazione di prospetti: per ogni tipo di script sql è necessario essere in grado di eseguire l'istruzione con java.
  • Analisi del risultato. È necessario essere in grado di raccogliere il reso in SELECTs e facoltativamente i parametri restituiti da funzioni o il numero di righe interessate/inserite.
  • Gestione errori: è necessario essere in grado di segnalare ciò che è accaduto allo Script SQL quando le cose non hanno funzionato come previsto.

Si prega di prendere in considerazione:

  • Questo mi sembra la programmazione di un client SQL. Se no, per favore, spiega cosa vuoi fare. Non utilizzare questo come livello di connessione in un'applicazione normale. Sarà estremamente inefficiente e vulnerabile alle iniezioni SQL (è molto più complicato delle semplici virgolette)
  • È possibile chiamare le funzioni o eseguire query con parametri esterni.
  • Questo non include le caratteristiche delle interfacce utente come l'evidenziazione della sintassi. Parametri interfacce, ecc ...
+0

Eseguito l'aggiornamento della domanda, @borjab per favore considera la nuova versione della domanda –

+0

Ho costruito un [progetto open source] (https://github.com/jonheller1/plsql_lexer) che potrebbe aiutare con molti dei passaggi precedenti. Può dividere le istruzioni in modo simile a SQL \ * Plus, classificare le istruzioni in modo da sapere cosa fare con esse, rimuovere punti e virgola non necessari (alcune istruzioni ne hanno bisogno e altre no) e fornire un feedback simile a SQL \ * Plus (ad es. "5 righe unite" per un'istruzione MERGE). È tutto in PL/SQL ma dovrebbe essere possibile chiamarlo da Java. –

0

La prima limitazione di PreparedStatement che viene in mente - non sarà in grado di registrare un parametro OUT (s) di una stored procedure, si potrebbe desiderare di guardare in CallableStatement interfaccia .

Problemi correlati