Tworzenie procedury składowanej i SQLite?

181

Czy w jakiś sposób można utworzyć procedurę przechowywaną podczas korzystania z SQLite?

grady
źródło

Odpowiedzi:

217

SQLite musiał poświęcić inne cechy, które niektórzy uważają za przydatne, takie jak wysoka współbieżność, precyzyjna kontrola dostępu, bogaty zestaw wbudowanych funkcji, procedury składowane , ezoteryczne funkcje języka SQL, rozszerzenia XML i / lub Java, tera lub skalowalność peta-bajtowa i tak dalej

Źródło: Odpowiednie zastosowania dla SQLite

h3xStream
źródło
3
Możesz użyć równoważnika SQLite funkcji SQL CLR, aby osiągnąć ten sam cel ( stackoverflow.com/questions/172735/… ).
devinbost
@bostIT Dziękujemy za dodanie.
Odwołaj się
91

Odpowiedź : NIE

Oto dlaczego ... Myślę, że kluczowym powodem przechowywania procs w bazie danych jest to, że wykonujesz kod SP w tym samym procesie co silnik SQL. Ma to sens w przypadku silników baz danych zaprojektowanych do pracy jako usługa połączona z siecią, ale SQLite wymaga znacznie mniej, ponieważ działa jako biblioteka DLL w procesie aplikacji, a nie w oddzielnym procesie silnika SQL. Dlatego bardziej sensowne jest zaimplementowanie całej logiki biznesowej, w tym kodu SP w języku hosta.

Możesz jednak rozszerzyć SQLite o własne funkcje zdefiniowane przez użytkownika w języku hosta (PHP, Python, Perl, C #, JavaScript , Ruby itp.). Następnie możesz użyć tych niestandardowych funkcji jako części dowolnego wyboru / aktualizacji / wstawiania / usuwania SQLite. Zrobiłem to w C # za pomocą SQLite DevArt do implementacji mieszania haseł.

Tony O'Hagan
źródło
16
Aby wyjaśnić ... Nie mówię, że nie ma ŻADNEGO powodu do implementacji SP w SQLite - po prostu znacznie mniej powodu niż w innych silnikach DB.
Tony O'Hagan
4
KLUCZOWYM powodem posiadania procedur przechowywanych jest zapobieganie iniekcji SQL. Istnieje jednak wiele innych powodów. Na przykład możliwość udostępniania odpowiednich zapytań przez osadzenie ich w pliku sqlite. Nie ma absolutnie żadnej różnicy między standardowym zapytaniem uruchamianym w kontekście aparatu SQL a wyborem SP. Oba działają na silniku SQL.
Dan.
4
@Dan Po pierwsze, SP istniały na długo przedtem, zanim jeszcze pomyślano o iniekcji SQL. Bez nich stworzono tysiące aplikacji opartych na SQL, które są bezpieczne przed tym atakiem. Sprawdziłem również kod niepewnych SP, które są podatne na wstrzykiwanie SQL (zwykle oparte na dynamicznym SQL). Więc nie, nie jest to główny powód. Istnieje wiele innych sposobów zapobiegania temu atakowi na wyższych poziomach.
Tony O'Hagan,
3
@Dan Większość silników SQL to klient / serwer (NIE SQLite!). W tych przypadkach wydajność jest kluczowym problemem przy podejmowaniu decyzji, gdzie umieścić logikę biznesową. Wykonywanie logiki biznesowej, niezależnie od tego, czy jest to zapytanie LUB interaktywny LUB kod warunkowy wewnątrz SP w silniku SQL, może (1) poprawić wydajność pobierania danych, (2) zmniejszyć ruch w sieci (3) zmniejszyć zużycie pamięci warstwy aplikacji (4) plany wykonania zapytania pamięci podręcznej (wstępnie skompilowane SP). Większość twórców aplikacji woli przenieść logikę biznesową poza silnik SQL (oczywiście nie zapytania!). W przypadku SQLite jest to mniej konieczne, ponieważ nie obsługuje klienta / serwera.
Tony O'Hagan,
Dzięki, Tony. Zastanawiałem się, dlaczego SQLite nie ma procedur, ale ma wbudowane funkcje ( sqlite.org/lang_corefunc.html )? Czy to prawda, że ​​dla RDBMS klient-serwer, takich jak postgresql, zarówno funkcje, jak i procedury są przechowywane po stronie serwera? Ponieważ SQLite nie wymaga serwera, jeśli SQLite nie ma procedur, to z tego samego powodu, czy też nie powinien mieć funkcji?
Tim
17

Jeśli nadal jesteś zainteresowany, Chris Wolf wykonał prototypową implementację SQLite z procedurami przechowywanymi. Szczegóły można znaleźć na jego blogu: Dodawanie procedur przechowywanych do SQLite

torial
źródło
5
Artykuł jest już martwy, ale projekt znajduje się na stronie github.com/wolfch/sqlite-3.7.3.p1 . Plik readme sugeruje, że nie jest on gotowy do produkcji, ani nie jest przeznaczony do eksperymentów. Wygląda na to, że jest to raczej dowód koncepcji.
pqsk
7

Jednak możliwe jest, aby udawać pomocą dedykowanego tabelę o nazwie dla swojej fałszywej-SP, z PO wyzwalacz INSERT. Dedykowane wiersze tabeli zawierają parametry dla fałszywego sp, a jeśli trzeba zwrócić wyniki, możesz mieć drugą (ewentualnie temp) tabelę (z nazwą związaną z fałszywym sp), która zawiera te wyniki. Wymagałoby to dwóch zapytań: najpierw WSTAW dane do tabeli fałszywych sp-trigger, a następnie WYBIERZ z tabeli fałszywych sp-wyników, które mogą być puste lub mieć pole komunikatu, jeśli coś pójdzie nie tak .

slashmais
źródło