Tạo thủ tục lưu trữ và SQLite?


Câu trả lời:


217

SQLite đã phải hy sinh các đặc điểm khác mà một số người thấy hữu ích, chẳng hạn như đồng thời cao, kiểm soát truy cập chi tiết, một bộ hàm tích hợp phong phú, các thủ tục được lưu trữ , các tính năng ngôn ngữ SQL bí mật, các phần mở rộng XML và / hoặc Java, tera- hoặc khả năng mở rộng peta-byte, v.v.

Nguồn: Sử dụng phù hợp cho SQLite


3
Bạn có thể sử dụng SQLite tương đương với các hàm SQL CLR để đạt được cùng một mục tiêu ( stackoverflow.com/questions/172735/ .).
devinbost

@bostIT Cảm ơn bạn đã bổ sung. Tham chiếu cho System.Data.SQLite system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
h3xStream

91

Trả lời : KHÔNG

Đây là lý do tại sao ... Tôi nghĩ một lý do chính cho việc lưu trữ procs trong cơ sở dữ liệu là bạn đang thực thi mã SP trong cùng quy trình với công cụ SQL. Điều này có ý nghĩa đối với các công cụ cơ sở dữ liệu được thiết kế để hoạt động như một dịch vụ được kết nối mạng, nhưng điều bắt buộc đối với SQLite ít được đưa ra là nó chạy như một DLL trong quy trình ứng dụng của bạn chứ không phải trong một quy trình công cụ SQL riêng biệt. Vì vậy, sẽ hợp lý hơn khi triển khai tất cả logic nghiệp vụ của bạn, bao gồm cả mã SP trong ngôn ngữ máy chủ.

Tuy nhiên, bạn có thể mở rộng SQLite bằng các hàm do người dùng xác định bằng ngôn ngữ máy chủ (PHP, Python, Perl, C #, Javascript , Ruby , v.v.). Sau đó, bạn có thể sử dụng các hàm tùy chỉnh này như một phần của bất kỳ lựa chọn / cập nhật / chèn / xóa SQLite nào. Tôi đã thực hiện điều này trong C # bằng cách sử dụng SQLite của DevArt để thực hiện băm mật khẩu.


16
Để làm rõ ... Tôi không nói rằng KHÔNG CÓ lý do nào để triển khai SP trong SQLite - lý do ít hơn nhiều so với các công cụ DB khác.
Tony O'Hagan

4
Lý do chính để có các thủ tục được lưu trữ là để ngăn chặn SQL Injection. Có nhiều lý do khác tuy nhiên. Ví dụ: có thể Chia sẻ các truy vấn có liên quan bằng cách nhúng chúng vào tệp sqlite. Hoàn toàn không có sự khác biệt giữa một truy vấn tiêu chuẩn chạy trong ngữ cảnh của Công cụ SQL và chọn SP. Cả hai đều CHẠY trên SQL Engine.
Dan

4
@Dan Trước tiên, SP tồn tại rất lâu trước khi SQL SQL thậm chí được nghĩ đến. Hàng ngàn ứng dụng dựa trên SQL đã được xây dựng mà không có chúng an toàn trước cuộc tấn công này. Tôi cũng đã xem xét các SP không an toàn dễ bị tấn công SQL (thường dựa trên SQL động). Vì vậy, không tôi không phải đây là một lý do chính. Có rất nhiều cách khác để ngăn chặn cuộc tấn công này tiếp tục tăng lên.
Tony O'Hagan

3
@Dan Hầu hết các công cụ SQL là máy khách / máy chủ (KHÔNG phải SQLite!), Đối với những điều này, hiệu suất là vấn đề chính khi quyết định nơi đặt logic kinh doanh của bạn. Thực hiện logic nghiệp vụ có thể là truy vấn HOẶC tương tác HOẶC mã có điều kiện bên trong SP trong công cụ SQL có thể (1) cải thiện hiệu suất truy xuất dữ liệu, (2) giảm lưu lượng mạng (3) giảm mức sử dụng bộ nhớ của lớp ứng dụng (4) SP). Hầu hết các nhà phát triển ứng dụng thích di chuyển một số logic kinh doanh của họ bên ngoài công cụ SQL (rõ ràng không phải là các truy vấn!). Đối với SQLite, điều này ít bắt buộc hơn vì nó không hỗ trợ máy khách / máy chủ.
Tony O'Hagan

Cảm ơn, Tony. Tôi đã tự hỏi tại sao SQLite không có quy trình nhưng có các hàm dựng sẵn ( sqlite.org/lang_corefunc.html )? Có đúng không đối với RDBMS máy khách-máy chủ như postgresql, cả chức năng và thủ tục đều được lưu trữ ở phía máy chủ? Vì SQLite không có máy chủ, nếu SQLite không có quy trình, thì với cùng một lý do, nó cũng không có chức năng?
Tim

17

Nếu bạn vẫn quan tâm, Chris Wolf đã thực hiện nguyên mẫu triển khai SQLite với Thủ tục lưu trữ. Bạn có thể tìm thấy các chi tiết tại bài đăng trên blog của mình: Thêm các thủ tục được lưu trữ vào SQLite


5
Bài viết đã chết, nhưng dự án đang ở github.com/wolfch/sqlite-3.7.3.p1 . Tệp readme ngụ ý rằng đây không phải là sản xuất sẵn sàng, cũng không phải để thử nghiệm. Có vẻ như đó là một bằng chứng về khái niệm.
pqsk

7

Tuy nhiên, có thể giả mạo nó bằng cách sử dụng một bảng chuyên dụng, được đặt tên cho sp giả của bạn, với trình kích hoạt SAU. Các hàng của bảng chuyên dụng chứa các tham số cho sp giả của bạn và nếu nó cần trả về kết quả, bạn có thể có bảng thứ hai (sở hữu temp) (có tên liên quan đến fake-sp) để chứa các kết quả đó. Nó sẽ yêu cầu hai truy vấn: đầu tiên là CHỌN dữ liệu vào bảng kích hoạt giả-sp và lần thứ hai để CHỌN từ bảng kết quả giả-sp, có thể để trống hoặc có trường thông báo nếu có sự cố .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.