Membuat prosedur tersimpan dan SQLite?

181

Apakah mungkin untuk membuat prosedur tersimpan, ketika menggunakan SQLite?

grady
sumber

Jawaban:

217

SQLite harus mengorbankan karakteristik lain yang berguna bagi beberapa orang, seperti konkurensi tinggi, kontrol akses berbutir halus, serangkaian fungsi bawaan, prosedur tersimpan , fitur bahasa esoterik SQL, ekstensi XML dan / atau Java, atau skalabilitas peta-byte, dan sebagainya

Sumber: Penggunaan yang Sesuai Untuk SQLite

h3xStream
sumber
3
Anda dapat menggunakan SQLite yang setara dengan fungsi SQL CLR untuk mencapai tujuan yang sama ( stackoverflow.com/questions/172735/… ).
devinbost
@ BITIT Terima kasih untuk penambahannya. Ref untuk System.Data.SQLite system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
h3xStream
91

Jawab : TIDAK

Inilah Mengapa ... Saya pikir alasan utama untuk menyimpan procs dalam database adalah bahwa Anda mengeksekusi kode SP dalam proses yang sama dengan mesin SQL. Ini masuk akal untuk mesin database yang dirancang untuk bekerja sebagai layanan yang terhubung jaringan tetapi keharusan untuk SQLite jauh lebih sedikit mengingat bahwa itu berjalan sebagai DLL dalam proses aplikasi Anda daripada dalam proses mesin SQL yang terpisah. Jadi lebih masuk akal untuk mengimplementasikan semua logika bisnis Anda termasuk apa yang seharusnya menjadi kode SP dalam bahasa host.

Namun Anda dapat memperluas SQLite dengan fungsi yang ditentukan pengguna Anda sendiri dalam bahasa host (PHP, Python, Perl, C #, Javascript , Ruby dll). Anda kemudian dapat menggunakan fungsi kustom ini sebagai bagian dari SQLite pilih / perbarui / masukkan / hapus. Saya telah melakukan ini di C # menggunakan SQLite DevArt untuk mengimplementasikan hashing kata sandi.

Tony O'Hagan
sumber
16
Untuk memperjelas ... Saya tidak mengatakan bahwa TIDAK ada alasan untuk mengimplementasikan SP di SQLite - hanya alasan yang jauh lebih sedikit daripada di mesin DB lainnya.
Tony O'Hagan
4
Alasan utama memiliki prosedur tersimpan adalah untuk mencegah SQL Injection. Namun ada banyak alasan lain. Misalnya bisa Berbagi kueri yang relevan dengan memasukkannya dalam file sqlite. Sama sekali tidak ada perbedaan antara permintaan standar yang berjalan dalam konteks Mesin SQL, dan memilih SP. Keduanya MENJALANKAN di SQL ENGINE.
Dan
4
@Dan Pertama, SP sudah ada jauh sebelum injeksi SQL bahkan telah dipikirkan. Ribuan aplikasi berbasis SQL telah dibangun tanpa mereka yang aman terhadap serangan ini. Saya juga mengkaji kode SP yang tidak aman yang rentan terhadap injeksi SQL (biasanya didasarkan pada SQL dinamis). Jadi tidak, saya tidak melakukan ini adalah alasan utama. Ada banyak cara lain untuk mencegah serangan ini lebih jauh ke stack.
Tony O'Hagan
3
@Dan Kebanyakan mesin SQL adalah klien / server (BUKAN SQLite!), Untuk ini, kinerja adalah masalah utama ketika memutuskan di mana harus meletakkan logika bisnis Anda. Menjalankan logika bisnis baik itu kueri ATAU interatif ATAU kode kondisional di dalam SP di mesin SQL dapat (1) meningkatkan kinerja pengambilan data, (2) mengurangi lalu lintas jaringan (3) mengurangi penggunaan memori lapisan aplikasi (4) rencana eksekusi permintaan cache (dikompilasi sebelumnya) SPs). Sebagian besar pengembang aplikasi lebih suka memindahkan beberapa logika bisnis mereka di luar mesin SQL (jelas bukan kueri!). Untuk SQLite ini kurang penting karena tidak mendukung klien / server.
Tony O'Hagan
Terima kasih, Tony. Saya bertanya-tanya mengapa SQLite tidak memiliki prosedur tetapi memiliki fungsi builtin ( sqlite.org/lang_corefunc.html )? Apakah benar bahwa untuk RDBMS server-klien seperti postgresql, kedua fungsi dan prosedur disimpan di sisi server? Karena SQLite tidak memiliki server, jika SQLite tidak memiliki prosedur, maka untuk alasan yang sama, haruskah ia tidak memiliki fungsi juga?
Tim
17

Jika Anda masih tertarik, Chris Wolf membuat prototipe implementasi SQLite dengan Stored Procedures. Anda dapat menemukan detailnya di posting blognya: Menambahkan Prosedur yang Disimpan ke SQLite

torial
sumber
5
Artikel sudah mati sekarang, tetapi proyeknya ada di github.com/wolfch/sqlite-3.7.3.p1 . File readme menyiratkan bahwa ini bukan produksi siap, juga bukan untuk eksperimen. Sepertinya itu lebih merupakan bukti konsep.
pqsk
7

Namun, dimungkinkan untuk memalsunya menggunakan tabel khusus, dinamai untuk palsu-sp Anda, dengan pemicu SETELAH INSERT. Baris tabel khusus berisi parameter untuk sp palsu Anda, dan jika perlu mengembalikan hasil, Anda dapat memiliki tabel kedua (poss. Temp) (dengan nama yang terkait dengan fake-sp) untuk memuat hasil tersebut. Ini akan membutuhkan dua pertanyaan: pertama untuk menyisipkan data ke dalam tabel trigger-sp-trigger-palsu, dan yang kedua untuk SELECT dari tabel-hasil-sp palsu, yang bisa kosong, atau memiliki bidang pesan jika ada masalah .

slashmais
sumber