0

私の会社には、有能で賢い運用スタッフがいて、一生懸命働いています。私は彼らに、急いでいるときに犯しやすい一般的で簡単に検出できる SQL の誤りを避けるのに役立つ SQL 実行ツールを提供したいと考えています。誰でもそのようなツールを提案できますか? 詳細は次のとおりです。

運用チームの任務の一部は、非常に複雑なアドホック SQL クエリを作成することです。驚くことではありませんが、オペレーターは多忙なため、作成するクエリに間違いを犯すことがあります。

幸いなことに、彼らのクエリはすべて、データを変更する SQL ではなく SELECT であり、とにかくデータベースのコピーで実行されています。それでも、実行する SQL のエラーを防止したいと考えています。たとえば、エラーが原因で実行時間の長いクエリが発生し、使用している重複システムの速度が低下し、原因となるクエリを見つけて強制終了するまで、他のユーザーに迷惑をかけることがあります。さらに悪いことに、時折、間違いが正しいと思われる答えにつながることがありますが、それはかなり後になるまでわかりません。

私たちの開発者も複雑なコードを書くときに間違いを犯しますが、入力時にエラーをキャッチするEclipse とさまざまなプラグイン ( FindBugsなど) を使用しています。オペレーターに似たようなものを提供したいと思います-理想的にはそれが見えるでしょう

SELECT U.NAME, C.NAME FROM USER U, COMPANY C WHERE U.NAME = 'ibell';

実行する前に、「ねえ、それがデカルト積だと気づきましたか?本当にそれを実行しますか?」と表示されます。非常にスマートである必要はありません。明らかに欠落している結合条件や同様の明らかなエラーを見つけることは問題ありません。

TOADがこれを行う必要があるように見えますが、そのような機能について何も見つけられないようです。この種のセミインテリジェントなエラー修正を提供できる TOAD のような他のツールはありますか?

更新: MySQL を使用していることを忘れていました。

4

7 に答える 7

2

人々がmysql(1)プログラムを使用してクエリを実行している場合は、safe-updatesオプション(別名i-am-a-dummy)を使用して、必要なものの一部を取得できます。その名前はやや誤解を招きます。WHEREなしでUPDATEとDELETEを防ぐだけでなく(心配していません)、暗黙のLIMIT 1000をSELECTステートメントに追加し、結合があり、1,000,000を超えるタプルを考慮すると推定されるSELECTを中止します---デカルトの参加を思いとどまらせる。

于 2008-08-19T03:10:41.253 に答える
1

..."非常に複雑なアドホック SQL クエリの作成.... とても忙しい"

危うしウィル・ロビンソン!

自動化 自動化 自動化。

理想的には、運用チームは、ストレスの多い状況でオンザフライでクエリを作成しなければならない立場に置かれるべきではありません。これは災害のレシピです! 適切なテストを経て、a) 希望どおりに動作すること、b) 監査証跡を提供すること、c) 「元に戻す」タイプの機能を備えていることを確認するために、事前に作成されたスクリプトのライブラリを構築することをお勧めします。

それができない場合は、SELECT権限のみを持つユーザーIDを与えると役立つ場合があります:-)

于 2008-08-21T08:04:21.603 に答える
0

私はこのようなものが存在することを期待していません。このツールは、最初にデータベース内のSQLパーサーが実装するすべてのものを実装する必要があり、次にデータモデル分析を実行して「不良」クエリを予測する必要があります。

最善の策は、疑わしいパターンの基本的なチェックを行い、標準の.sqlモードとは異なる方法でそれらを強調表示するテキストエディターのプラグインを作成することです。しかし、それでもかなり難しいでしょう。

where句なしでupdateステートメントを入力するたびにアラームベルを鳴らすツールに満足しています。そして、おそらく、そのような間違いが起こる長い一日の後の朝の約1であるため、軽度の電気ショックを与えました。

于 2008-08-19T02:42:37.053 に答える
0

非常に少量のダミーデータを使用してサンプルデータベースを設定し、最初にクエリを受信することで、これを構築するのは非常に簡単です。いくつかのことが起こります:

  1. SQL構文エラーが発生する可能性があります。これは、データベースが小さいため、データベースをあまりロードしません。
  2. 1つ以上のテーブルのすべての行が含まれていることを明確に示すことができる応答が返される場合がありますが、これはおそらく彼らが望んでいることではありません。
  3. 上記の条件を満たしたものは問題ない可能性が高いため、本番データベースのコピーに対して実行できます。

スキーマがあまり変更されず、特に奇妙ではないと仮定すると、上記の記述が問題の最も迅速な解決策になる可能性があります。

于 2008-08-19T02:48:05.043 に答える
0

いくつかのコーディング標準から始めます-たとえば、例では結合のタイプを使用しないでください-多くの場合、悪い結果になります(特にSQL Serverでそのように外部結合を行おうとすると、悪い結果が得られます)。明示的な結合を行う必要があります。

複雑なリレーションシップがある場合は、それらをビューに配置してから、ビューからアドホック クエリを作成することを検討してください。そうすれば、少なくとも、結合を間違えるという間違いを犯すことはありません。

于 2009-01-05T20:28:28.463 に答える
0

クエリを実行できる時間を制限することはできませんか? MySQL についてはわかりませんが、SQL Server の場合、既定のクエリ アナライザーだけでも、クエリがタイムアウトするまでの実行時間を制限できます。権限が制限されているため、SELECT クエリのみを実行できます。

于 2009-01-05T20:35:32.490 に答える
0

redgate のSQL Promptが役に立つかもしれません。MSSQL Server 専用なので、どのデータベース エンジンを使用しているかわかりません。

于 2008-08-19T00:05:24.873 に答える