2010-07-26 25 views

Antwort

173

SQLite hatte andere Eigenschaften zu opfern, dass einige Leute nützlich finden, wie zum Beispiel hohe Parallelität, feinkörnige Zugriffskontrolle, ein umfangreicher Satz von eingebauten Funktionen, gespeicherte Prozeduren, esoterische Sprache SQL-Funktionen , XML und/oder Java-Erweiterungen, Tera- oder peta-Byte-Skalierbarkeit und so weiter

Quelle: Appropriate Uses For SQLite

+1

Sie können das SQLite-Äquivalent von SQL CLR-Funktionen verwenden, um dasselbe Ziel zu erreichen (http://stackoverflow.com/questions/172735/create-use-user-de-functed-functions-in-system-data-sqlite). – devinbost

+0

@bostit Danke für die Zugabe. Ref für System.Data.SQLite http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki – h3xStream

20
+2

Dieser Link ist jetzt tot –

+1

Während dieser Link die Frage beantworten kann, ist es besser um die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/19047098) –

14

Wenn Sie noch interessiert sind, hat Chris Wolf eine prototypische Implementierung von SQLite mit Stored Procedures gemacht. Sie können die Details in seinem Blog-Post finden: Adding Stored Procedures to SQLite

+2

Artikel ist jetzt tot, aber das Projekt ist unter https://github.com/wolfch/sqlite-3.7.3.p1. Die Readme-Datei impliziert, dass dies weder produktionsbereit ist, noch für Experimente.Es scheint eher ein Beweis für das Konzept zu sein. – pqsk

72

Antwort: NO

hier, warum ... Ich denke, ein wichtiger Grund für die in einer Datenbank gespeichert Procs ist, dass du bist Ausführung von SP-Code im selben Prozess wie die SQL-Engine. Dies ist sinnvoll für Datenbank-Engines, die als netzwerkverbundener Dienst ausgeführt werden, aber der Imperativ für SQLite ist viel weniger gegeben, da es als DLL in Ihrem Anwendungsprozess und nicht in einem separaten SQL-Engine-Prozess ausgeführt wird. Daher ist es sinnvoller, alle Ihre Geschäftslogik einschließlich des SP-Codes in der Hostsprache zu implementieren.

Sie können jedoch SQLite mit Ihrer eigenen user defined functions in der Host-Sprache (PHP, Python, Perl, C#, Javascript, Ruby usw.) erweitern. Sie können diese benutzerdefinierten Funktionen dann als Teil eines beliebigen SQLite-Verzeichnisses select/update/insert/delete verwenden. Ich habe done this in C# mit DevArt's SQLite, um Passwort Hashing zu implementieren.

+14

Zur Klarstellung ... Ich sage nicht, dass es keinen Grund gibt, SPs in SQLite zu implementieren - nur viel weniger als in anderen DB-Engines. –

+3

Der Hauptgrund für gespeicherte Prozeduren besteht darin, SQL Injection zu verhindern. Es gibt jedoch viele andere Gründe. Zum Beispiel in der Lage, die relevanten Abfragen zu teilen, indem Sie sie in die SQLite-Datei eingebettet haben. Es gibt absolut keinen Unterschied zwischen einer Standardabfrage, die im Kontext der SQL Engine ausgeführt wird, und einem SP. Sie laufen beide auf dem SQL-ENGINE. – Dan

+2

@Dan Zuerst gab es SPs, lange bevor man an die SQL-Injection dachte. Tausende von SQL-basierten Apps wurden ohne sie entwickelt, die gegen diesen Angriff sicher sind. Ich habe auch unsichere SPs untersucht, die anfällig für SQL-Injection sind (typischerweise auf dynamischem SQL basiert). Also nein, das ist nicht der Hauptgrund. Es gibt viele andere Möglichkeiten, diesen Angriff weiter oben auf dem Stapel zu verhindern. –

2

Nur weil die meisten Anwendungen, die SQLite verwenden, keine gespeicherten Prozeduren verwenden, bedeutet dies nicht, dass sie nicht nützlich sind.

Eine der Hauptverwendungen, die ich für sie habe, ist, dass ich nicht eine gesamte App neu verteilen muss, wenn sich eine Abfrage leicht ändert. Nur die db ändert sich, und das ist ein einfaches Skript, normalerweise weniger als 1k.

Ich überlege, ob ich meine gespeicherten Proc C#/SQL-Code veröffentlichen sollte. Ich habe diesen Thread gefunden, als ich nach anderen Personen gesucht habe.

Ich bin nicht der Meinung, dass Leute (manchmal) möchten, dass der Sproc im selben Ausführungsraum wie der Server ausgeführt wird, aber SQLite ist definitionsgemäß im selben Raum wie die Anwendung.