สร้างกระบวนงานที่เก็บไว้และ SQLite หรือไม่


คำตอบ:


217

SQLite ต้องเสียสละคุณสมบัติอื่น ๆ ที่บางคนพบว่ามีประโยชน์เช่นการทำงานพร้อมกันสูง, การควบคุมการเข้าถึงอย่างละเอียด, ชุดฟังก์ชั่นในตัวที่หลากหลาย, ขั้นตอนการจัดเก็บ , คุณสมบัติภาษา SQL ลึกลับ, XML และ / หรือ Java ส่วนขยาย หรือความสามารถในการปรับขนาด Peta-byte และอื่น ๆ

ที่มา: การใช้ที่เหมาะสมสำหรับ SQLite


3
คุณสามารถใช้ฟังก์ชัน SQL CLR ที่เทียบเท่ากับ SQLite เพื่อบรรลุเป้าหมายเดียวกัน ( stackoverflow.com/questions/172735/… )
devinbost

@bostIT ขอบคุณสำหรับการเพิ่ม Ref สำหรับ System.Data.SQLite system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
h3xStream

91

คำตอบ : ไม่

นี่คือเหตุผล ... ฉันคิดว่าเหตุผลสำคัญสำหรับการจัดเก็บ procs ในฐานข้อมูลคือคุณกำลังรันรหัส SP ในกระบวนการเดียวกับโปรแกรม SQL สิ่งนี้เหมาะสมสำหรับเอ็นจินฐานข้อมูลที่ออกแบบมาเพื่อทำงานเป็นเซอร์วิสที่เชื่อมต่อกับเครือข่าย แต่ความจำเป็นสำหรับ SQLite นั้นน้อยกว่ามากเนื่องจากมันทำงานเป็น DLL ในกระบวนการแอปพลิเคชันของคุณมากกว่าในกระบวนการเอ็นจิน SQL แยกต่างหาก ดังนั้นจึงเหมาะสมที่จะใช้ตรรกะทางธุรกิจทั้งหมดของคุณรวมถึงสิ่งที่จะเป็นรหัส SP ในภาษาโฮสต์

อย่างไรก็ตามคุณสามารถขยาย SQLite ด้วยฟังก์ชั่นที่ผู้ใช้กำหนดเองในภาษาโฮสต์ (PHP, Python, Perl, C #, Javascript , Rubyฯลฯ ) จากนั้นคุณสามารถใช้ฟังก์ชั่นที่กำหนดเองเหล่านี้เป็นส่วนหนึ่งของ SQLite select / update / insert / delete ฉันทำสิ่งนี้ใน C #โดยใช้SQLite ของ DevArtเพื่อใช้การแฮชรหัสผ่าน


16
ชี้แจง ... ฉันไม่ได้บอกว่าไม่มีเหตุผลที่จะใช้ SP ใน SQLite - มีเหตุผลน้อยกว่าในเครื่องมือ DB อื่น ๆ
Tony O'Hagan

4
เหตุผลสำคัญของการมีโพรซีเดอร์ที่เก็บไว้คือเพื่อป้องกัน SQL Injection ยังมีเหตุผลอื่นอีกมากมาย ตัวอย่างเช่นความสามารถในการแชร์คิวรีที่เกี่ยวข้องโดยให้ฝังไว้ในไฟล์ sqlite ไม่มีความแตกต่างระหว่างเคียวรีมาตรฐานที่รันในบริบทของ SQL Engine และการเลือก SP พวกเขาทั้งคู่กำลังทำงานอยู่บน SQL Engine
ด่าน

4
@Dan ประการแรก SP มีมานานก่อนที่การฉีด SQL จะได้รับการคิด แอพที่ใช้ SQL เป็นพัน ๆ ตัวนั้นถูกสร้างขึ้นโดยปราศจากพวกมันที่ปลอดภัยจากการโจมตีครั้งนี้ ฉันยังได้รหัสตรวจสอบ SPs ที่ไม่ปลอดภัยที่มีความเสี่ยงต่อการฉีด SQL (โดยทั่วไปจะขึ้นอยู่กับไดนามิก SQL) ดังนั้นไม่ฉันไม่ได้นี่คือเหตุผลหลัก ยังมีอีกหลายวิธีในการป้องกันการโจมตีนี้ขึ้นไปบนกองซ้อน
Tony O'Hagan

3
@Dan เครื่องมือ SQL ส่วนใหญ่เป็นไคลเอนต์ / เซิร์ฟเวอร์ (ไม่ใช่ SQLite!) สำหรับสิ่งเหล่านี้ประสิทธิภาพเป็นประเด็นสำคัญเมื่อตัดสินใจว่าจะวางตรรกะทางธุรกิจของคุณไว้ที่ไหน การดำเนินการตรรกะทางธุรกิจไม่ว่าจะเป็นการสืบค้นหรือรหัสแทรกหรือเงื่อนไขภายใน SP ในเครื่องยนต์ SQL สามารถ (1) ปรับปรุงประสิทธิภาพการดึงข้อมูล (2) ลดปริมาณการใช้เครือข่าย (3) ลดการใช้หน่วยความจำของแอปชั้นวาง (4) สำนัก) นักพัฒนาแอปส่วนใหญ่ต้องการย้ายตรรกะทางธุรกิจของพวกเขาออกไปนอกเอ็นจิ้น SQL (เห็นได้ชัดว่าไม่ใช่คำสั่ง!) สำหรับ SQLite สิ่งนี้มีความจำเป็นน้อยกว่าเนื่องจากไม่รองรับไคลเอ็นต์ / เซิร์ฟเวอร์
Tony O'Hagan

ขอบคุณโทนี่ ฉันสงสัยว่าทำไม SQLite จึงไม่มีโพรซีเดอร์ แต่มีฟังก์ชัน builtin ( sqlite.org/lang_corefunc.html ) ถูกต้องหรือไม่ว่า RDBMS สำหรับไคลเอนต์ - เซิร์ฟเวอร์เช่น postgresql ทั้งฟังก์ชั่นและโพรซีเดอร์จะถูกเก็บไว้ที่ฝั่งเซิร์ฟเวอร์? เนื่องจาก SQLite นั้นไม่ใช้เซิร์ฟเวอร์หาก SQLite ไม่มีโพรซีเดอร์ดังนั้นด้วยเหตุผลเดียวกันมันจึงไม่มีฟังก์ชั่นใช่หรือไม่
ทิม

17

หากคุณยังสนใจ Chris Wolf ได้สร้างต้นแบบการใช้งานของ SQLite ด้วยกระบวนงานที่เก็บไว้ คุณสามารถค้นหารายละเอียดได้ที่โพสต์บล็อกของเขา: เพิ่มวิธีการจัดเก็บเพื่อ SQLite


5
บทความเป็นตายในขณะนี้ แต่โครงการที่github.com/wolfch/sqlite-3.7.3.p1 ไฟล์ readme บอกเป็นนัยว่านี่ยังไม่พร้อมสำหรับการผลิตและไม่มีไว้สำหรับการทดลอง ดูเหมือนว่าจะเป็นการพิสูจน์แนวคิดมากกว่า
pqsk

7

แต่มันเป็นไปได้ที่จะปลอมมันโดยใช้ตารางเฉพาะสำหรับชื่อปลอมของคุณด้วยทริกเกอร์ AFTER INSERT แถวตารางเฉพาะมีพารามิเตอร์สำหรับ sp ปลอมของคุณและหากต้องการส่งคืนผลลัพธ์คุณสามารถมีตารางที่สอง (poss. temp) (มีชื่อที่เกี่ยวข้องกับ fake-sp) เพื่อเก็บผลลัพธ์เหล่านั้น มันจะต้องมีสองแบบสอบถาม: ข้อมูล INSERT แรกเข้าไปในตารางปลอม -sp-trigger-table และที่สองเพื่อเลือกจากตารางปลอม -sp- ผลลัพธ์ - ซึ่งอาจจะว่างเปล่าหรือมีช่องข้อความถ้ามีอะไรผิดพลาด .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.