Perché vuoi evitare Dynamic SQL nella procedura memorizzata?


13

Ho sentito dire che non vuoi usare Dynamic SQL. Puoi fare qualche esempio concreto o esempio di vita reale? Personalmente, lo codice alcune volte nel mio database. Penso che sia OK perché è flessibilità. La mia ipotesi riguarda SQL Injection o Performance. Qualunque altra cosa?

Risposte:


7

Non c'è niente di sbagliato nell'uso di SQL dinamico, se necessario. In effetti in alcune circostanze è l'unica opzione che hai. È più una raccomandazione di non usarlo poiché sì può portare a un'iniezione di SQL se l'input non è igienizzato, e sì l'uso di SQL dinamico in moduli che vengono chiamati spesso può essere dannoso per le sue prestazioni.

Non credo che ci sia un esempio concreto di per sé, ma direi questo: cerca di ottenere quello che sei dopo aver usato prima le query e le dichiarazioni regolari - solo allora una volta che hai esaurito tutte le altre strade lo fai in modo dinamico. Ricorda solo che l'esecuzione di una stringa SQL dinamica viene eseguita in una sessione utente separata per il modulo che la sta chiamando, quindi potresti riscontrare problemi di autorizzazione che non ti aspetti.

Se sei preoccupato per le prestazioni; Provalo. Se sei preoccupato per la sicurezza; convalida il tuo input. Non c'è giusto o sbagliato - solo che usi il tuo miglior giudizio sulla base delle informazioni e degli strumenti che hai a tua disposizione in quel momento.


5

SQL dinamico è uno strumento. E come strumento, ha alcune applicazioni - per i lavori amministrativi è una benedizione, per esempio.

Non così buono su SP utilizzato dalle applicazioni, soprattutto se non hai gestito la parametrizzazione del codice generato (le ultime versioni di SQL Server hanno ridotto i problemi, ma comunque valide).

Non entrerò in dettaglio qui, quindi consiglierò un eccellente articolo sui problemi di Dynamic SQL: The Curse and Blessings of Dynamic SQL di MVP Erland Sommarskog.


1
Stavo per condividere anche quel link, è necessario leggere per chiunque stia pensando di utilizzare SQL dinamico.
HLGEM,

1

È come la maggior parte delle funzionalità di dbms, se lo usi nella situazione giusta fa bene il suo lavoro, la situazione sbagliata lo fa male.

Pro: alcune cose non possono essere fatte senza di essa. In genere ho scoperto che questo è solo per lavoro amministrativo e non per codice dell'applicazione. Alcuni comandi di sistema non consentono l'utilizzo di parametri come input. Quindi, ad esempio, se devo eseguire qualcosa attraverso uno sproc su ogni database, su molte istanze con database sconosciuti, e il comando non accetta parametri, di solito lo risolvo tramite SQL dinamico. Questo è più importante in Sybase ASE che in MSSQL.

Contro: non approfondirò molto, dal momento che penso che lo sappiamo già tutti, ma può esserci qualche rischio per l'iniezione di SQL se usato in modo errato. Il più grande per me è che la query verrà trattata come è, una query ad hoc univoca e non parte del piano di query compilato. Per qualcosa che funziona di tanto in tanto, non è un grosso problema. Per qualcosa che viene eseguito centinaia di volte al minuto e che avrà un sacco di sql univoci, genererebbe un sacco di piani di query nuovi, potenzialmente non necessari, che consumano cicli e accorciando il tempo valido della cache del piano.


Un eccellente utilizzo dell'applicazione in Sybase ASE sono i pivot senza conoscere i valori da pivotare. Questo può essere fatto usando SQL dinamico in un proc memorizzato, ma per quanto ne so Sybase ASE non supporta la sintassi per farlo direttamente come una query. Solo una volta che i valori sono noti, la query può essere scritta per ruotare i dati.
richardcrossley,

-7

Non utilizzare Dynamic SQL.

Il 99% delle volte viene utilizzato Dynamic SQL a causa della mancanza di conoscenza su come utilizzare i parametri opzionali nelle procedure memorizzate, il resto l'1% delle volte viene utilizzato per creare una query molto complessa per un report che il cliente non comprende anche. The Curse and Blessings of Dynamic SQL non mostra un esempio del perché sarebbe una buona idea usarlo, invece suggerisce solo che è problematico perché aumenta la complessità del debug, mantenendo, per non parlare dei rischi di sicurezza di SQL Iniezione, scarse prestazioni non a causa della cache ma delle cattive pratiche che ne derivano come l'uso di tabelle temporanee e cursori che ovviamente sono pigri e ingenuiil programmatore avrebbe abusato di. Non esiste la flessibilità di scrivere query in quel modo, SQL è un linguaggio dichiarativo e dovrebbe essere trattato come tale.

La pigrizia è la radice di tutti i mali.

Paradossalmente questa risposta si posizionerà tra le più votate .


L'articolo, in effetti, offre almeno un esempio di un caso d'uso ideale per SQL dinamico e "non esiste la flessibilità di scrivere query in questo modo ..." non è vero: SQL dinamico è esattamente ciò che consente questo flessibilità.
LowlyDBA,

Parametri opzionali? Intendi l' antipasto?
Forrest,

@LowlyDBA L'articolo offre almeno un esempio: il SELEZIONAMENTO più semplice mai visto, quale problema complesso sta risolvendo? e per la flessibilità, sì, per quegli ingenui programmatori.
Ivanzinho,

@Forrest perché lo chiami "antipattern"? perché il link che hai fornito non lo dice mai, e inoltre non mostra mai quanti miglioramenti sono stati fatti dopo che la logica è stata riscritta in un Dynamic SQL (che in questo caso sarebbe insignificante rispetto all'effetto valanga di mantenere quella query alla fine)
Ivanzinho

Questa è una risposta (scarsa) basata sull'opinione IMHO. Non hai fornito esempi concreti dei problemi che descrivi, né hai definito i pro dell'utilizzo dell'SQL dinamico
George.Palacios
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.