6

私が持っているサイトの 1 つで、開発者向けに data.stackexchange.com のような SQL コンソールを提供する予定です。問題は、すべてのタイプの SQL を実行させることができないことです。そのため、いくつかの制限があります。制約の例を次に示します。

  • クエリにCOUNT()関数を含めることはできません
  • すべてのクエリにはLIMIT最大値を含める必要があります100
  • 列数は次の数を超えることはできません5
  • プライバシー リージョンが原因で、一部のテーブルのデータにアクセスできません。
  • SELECT使用できるのはステートメントのみです。

私は今何をしていますか?

これらをフィルタリングするために正規表現を使用しています。また、EXPLAIN または同様のクエリを呼び出して、実行前にデータベースへの影響を判断することも計画しています。

正規表現よりも良い方法はありますか? data.SE ではどのように行われますか? 他に心配すべきことはありますか?

更新 1

これら 2 つのルールは、データベース サーバーでユーザー権限を制限することで適用できます。

  • プライバシー リージョンが原因で、一部のテーブルのデータにアクセスできません。
  • SELECT使用できるのはステートメントのみです。

したがって、唯一の問題はSQLを検証することです

更新 2

私がSQLパーサーを書けば、それでうまくいくことはわかっています。JS インタープリターを書くことはeval()、その悪い習慣として単に削除するようなものです。そのため、SQL パーサーをゼロから作成することは、実際には選択肢ではありません。ここ。

4

1 に答える 1

1

SQL のサブセットを含む yacc の新しい文法を作成できます。この文法で入力 SQL をチェックすることができます。 SQL lex yacc 文法

于 2012-12-26T04:28:36.033 に答える