Membuat prosedur tersimpan dan SQLite?


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


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.


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


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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.