Mengapa Anda ingin menghindari Dynamic SQL dalam prosedur tersimpan?

13

Saya pernah mendengar seseorang berkata Anda tidak ingin menggunakan Dynamic SQL. Bisakah Anda memberikan contoh nyata atau contoh nyata? Secara pribadi, saya kode beberapa kali di database saya. Saya pikir itu OK karena fleksibilitas. Dugaan saya adalah tentang SQL Injection atau Performance. Ada yang lain?

Richard Sayakanit
sumber

Jawaban:

7

Tidak ada yang salah dengan menggunakan SQL dinamis jika Anda harus. Bahkan dalam beberapa keadaan itu adalah satu-satunya pilihan yang Anda miliki. Ini lebih dari rekomendasi untuk tidak menggunakannya karena ya itu dapat menyebabkan injeksi SQL jika input Anda tidak disanitasi, dan ya menggunakan SQL dinamis dalam modul yang dipanggil sering dapat merusak kinerjanya.

Saya tidak berpikir ada contoh konkret sebagai per se tetapi saya akan mengatakan ini: Cobalah untuk mencapai apa yang Anda setelah menggunakan pertanyaan dan pernyataan reguler pertama - hanya setelah Anda kehabisan semua jalan lain melakukannya secara dinamis. Ingatlah bahwa mengeksekusi string SQL dinamis dilakukan dalam sesi pengguna terpisah ke modul yang memanggilnya - sehingga Anda dapat mengalami masalah izin di mana Anda tidak mengharapkannya.

Jika Anda khawatir tentang kinerja; menguji. Jika Anda khawatir tentang keamanan; validasi input Anda. Tidak ada benar atau salah - hanya bahwa Anda menggunakan penilaian terbaik Anda berdasarkan informasi dan alat yang Anda miliki saat itu.

Mr.Brownstone
sumber
5

SQL dinamis adalah alat. Dan sebagai alat, ia memiliki beberapa aplikasi - untuk pekerjaan administratif itu adalah berkah, misalnya.

Tidak begitu baik pada SP yang digunakan oleh aplikasi, terutama jika Anda tidak mengelola parameterisasi dari kode yang dihasilkan (versi terbaru dari SQL Server mengurangi masalah, tetapi masih valid).

Saya tidak akan memasukkan detail di sini, jadi saya akan merekomendasikan artikel yang bagus tentang masalah Dynamic SQL: Kutukan dan Berkat dari Dynamic SQL oleh MVP Erland Sommarskog.

Fabricio Araujo
sumber
1
Saya akan membagikan tautan itu juga, itu harus dibaca untuk siapa pun yang mempertimbangkan menggunakan SQL dinamis.
HLGEM
1

Ini seperti kebanyakan fitur dbms, jika Anda menggunakannya dalam situasi yang tepat itu berfungsi dengan baik, situasi yang salah melakukannya dengan buruk.

Pro: Beberapa hal tidak bisa dilakukan tanpa itu. Biasanya saya hanya menemukan ini untuk pekerjaan administrasi, dan bukan kode aplikasi. Beberapa perintah sistem tidak mengizinkan parameter digunakan sebagai input. Jadi misalnya jika saya perlu menjalankan sesuatu melalui sproc terhadap setiap database, pada banyak contoh dengan database yang tidak diketahui, dan perintah tidak menerima parameter, saya biasanya menyelesaikan ini melalui SQL dinamis. Namun ini lebih merupakan hal di Sybase ASE daripada MSSQL.

Cons: Saya tidak akan banyak membahasnya, karena saya pikir kita semua sudah mengetahuinya, tetapi mungkin ada beberapa risiko untuk injeksi SQL jika digunakan secara tidak benar. Yang lebih besar bagi saya adalah bahwa kueri akan diperlakukan seperti apa adanya, kueri adhoc unik, dan bukan bagian dari paket kueri yang dikompilasi. Untuk sesuatu yang berjalan sesekali, bukan masalah besar. Untuk sesuatu yang dieksekusi ratusan kali semenit dan yang akan memiliki banyak sql unik, itu akan menghasilkan banyak rencana kueri yang berpotensi tidak perlu, menghabiskan siklus, dan mempersingkat waktu cache rencana yang valid.

DBAMengagumkanBadAt Ini
sumber
Penggunaan aplikasi yang sangat baik di Sybase ASE adalah pivot tanpa mengetahui nilai yang akan diputar. Ini dapat dilakukan dengan menggunakan SQL dinamis dalam proc yang disimpan, tetapi sejauh yang saya tahu Sybase ASE tidak mendukung sintaksis untuk melakukan ini secara langsung sebagai kueri. Hanya setelah nilai diketahui, kueri dapat ditulis untuk memutar data.
richardcrossley
-7

Jangan gunakan SQL Dinamis.

99% waktu Dynamic SQL digunakan karena kurangnya pengetahuan tentang cara menggunakan parameter opsional dalam prosedur tersimpan, sisanya 1% dari waktu digunakan untuk membuat kueri yang sangat kompleks untuk laporan yang tidak dipahami pelanggan. bahkan. Kutukan dan Berkat dari Dynamic SQL tidak menunjukkan contoh mengapa itu akan menjadi ide yang baik untuk menggunakannya, sebaliknya hanya menyarankan bahwa itu bermasalah karena meningkatkan kompleksitas untuk debugging, memelihara, belum lagi risiko keamanan SQL Injeksi, kinerja yang buruk bukan karena cache tetapi praktik buruk yang menyertainya seperti menggunakan tabel sementara dan kursor yang tentu saja malas dan naifprogrammer akan menyalahgunakan. Tidak ada yang namanya fleksibilitas untuk menulis query seperti itu, SQL adalah bahasa deklaratif dan harus ditangani seperti itu.

Kemalasan adalah akar dari semua kejahatan.

Paradoksnya jawaban ini akan peringkat di yang paling downvoted .

Ivanzinho
sumber
Artikel itu, pada kenyataannya, menawarkan setidaknya satu contoh kasus penggunaan ideal untuk SQL dinamis dan "tidak ada yang namanya fleksibilitas untuk menulis pertanyaan seperti itu ..." tidak benar - SQL dinamis adalah persis apa yang memungkinkan ini fleksibilitas.
LowlyDBA
Parameter opsional? Anda maksud antipattern?
Forrest
@ LowlyDBA Artikel ini menawarkan setidaknya satu contoh: SELECT paling sederhana yang pernah dilihat, masalah rumit apa yang memecahkan itu? dan untuk fleksibilitas, ya, bagi para programmer yang naif.
Ivanzinho
@ Forrest mengapa Anda menyebutnya "antipattern"? karena tautan yang Anda berikan tidak pernah mengatakan itu, dan juga tidak pernah menunjukkan berapa banyak peningkatan yang dibuat setelah logika ditulis ulang ke Dynamic SQL (yang dalam hal ini tidak signifikan dibandingkan dengan efek bola salju dari mempertahankan permintaan itu nantinya)
Ivanzinho
Ini adalah jawaban IMHO (buruk) berdasarkan pendapat. Anda belum memberikan contoh konkret dari masalah yang Anda gambarkan, atau Anda juga tidak mendefinisikan pro tentang penggunaan SQL dinamis
George.Palacios