ストアドプロシージャとSQLiteを作成しますか?


回答:


217

SQLiteは、同時実行性が高く、きめ細かいアクセス制御、豊富な組み込み関数、ストアドプロシージャ、難解なSQL言語機能、XMLおよび/またはJava拡張、テラまたはペタバイトのスケーラビリティなど

出典:SQLiteの適切な使用法


3
SQL CLR関数に相当するSQLiteを使用して、同じ目標を達成できます(stackoverflow.com/questions/172735/…)。
devinbost 2014

@bostIT追加ありがとうございます。System.Data.SQLiteの参照system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
h3xStream

91

回答いいえ

ここに理由があります...データベースにプロシージャを格納する主な理由は、SQLエンジンと同じプロセスでSPコードを実行しているためだと思います。これは、ネットワーク接続されたサービスとして機能するように設計されたデータベースエンジンにとっては理にかなっていますが、個別のSQLエンジンプロセスではなくアプリケーションプロセスでDLLとして実行されるため、SQLiteの必須事項ははるかに少なくなります。したがって、ホスト言語のSPコードを含めて、すべてのビジネスロジックを実装する方が理にかなっています。

ただし、ホスト言語(PHP、Python、Perl、C#、JavascriptRubyなど)で独自のユーザー定義関数使用してSQLiteを拡張できます。その後、これらのカスタム関数をSQLiteの選択、更新、挿入、削除の一部として使用できます。パスワードハッシュを実装するためにDevArtのSQLiteを使用してC#でこれを行いまし


16
明確にするために...私はSQLiteにSPを実装する理由がないと言っているのではありません-他のDBエンジンよりもはるかに少ない理由です。
Tony O'Hagan

4
ストアドプロシージャを使用する主な理由は、SQLインジェクションを防ぐためです。ただし、他にも多くの理由があります。たとえば、sqliteファイルに埋め込むことで、関連するクエリを共有できます。SQLエンジンのコンテキストで実行される標準クエリと、SPの選択との間にまったく違いはありません。どちらもSQLエンジンで実行されています。
Dan

4
@Danまず、SPはSQLインジェクションが考えられるよりずっと前に存在していました。この攻撃に対して安全な、数千ものSQLベースのアプリがアプリなしで構築されています。また、SQLインジェクションに対して脆弱な(通常は動的SQLに基づく)安全でないSPのコードもレビューしました。ですから、私はそうではありません。これが主な理由です。この攻撃をスタックのさらに上の方に防ぐ方法は他にもたくさんあります。
Tony O'Hagan

3
@DanほとんどのSQLエンジンはクライアント/サーバーです(SQLiteではありません)。これらの場合、ビジネスロジックをどこに配置するかを決定するときのパフォーマンスは重要な問題です。SQLエンジンのSP内でクエリORインタラクティブOR条件付きコードでビジネスロジックを実行すると、(1)データ取得のパフォーマンスが向上し、(2)ネットワークトラフィックが減少する(3)アプリレイヤーのメモリ使用量が減少する(4)キャッシュクエリの実行計画(プリコンパイル済み) SP)。ほとんどのアプリ開発者は、ビジネスロジックの一部をSQLエンジンの外に移動することを好みます(明らかにクエリではありません!)。SQLiteの場合、クライアント/サーバーをサポートしていないため、これは必須事項ではありません。
Tony O'Hagan

ありがとう、トニー。SQLiteにはプロシージャがないのに組み込み関数(sqlite.org/lang_corefunc.html)があるのはなぜですか?postgresqlなどのクライアントサーバーRDBMSの場合、関数とプロシージャの両方がサーバー側に格納されていることは正しいですか?SQLiteはサーバーレスであるため、SQLiteにプロシージャがない場合、同じ理由で、SQLiteにも関数がないはずですか?
Tim、

17

まだ興味がある場合は、Chris Wolfがストアドプロシージャを使用してSQLiteのプロトタイプ実装を作成しました。詳細については、彼のブログ投稿:SQLiteへのストアドプロシージャの追加をご覧ください。


5
記事は現在死んでいますが、プロジェクトはgithub.com/wolfch/sqlite-3.7.3.p1にあります。readmeファイルは、これが本番環境での準備ができていないこと、および実験用ではないことを意味します。それは概念の証明のようです。
pqsk 2016年

7

しかし、AFTER INSERTトリガーを使用して、fake-spにちなんで名付けられた専用のテーブルを使用してそれ偽造することは可能です。専用のテーブル行には、偽のspのパラメーターが含まれます。結果を返す必要がある場合は、(偽のspに関連する名前を持つ)2番目の(一時的な)テーブルにそれらの結果を含めることができます。2つのクエリが必要になります。1つ目はデータをfake-sp-trigger-tableに挿入し、2つ目はfake-sp-results-tableからSELECTします。 。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.