2011-08-23 27 views
0

特定のクエリによってDBの状態が変更されると判断する方法を教えてください。 私はJDBCを使用しています。 INSERT、DELETEなどのキーワードを解析する構文解析を使用するか、その他の方法がありますか?クエリが変更されるかどうかの判断DB

+0

データベースが変更される可能性がある場合、または何かが実際に変更されるかどうかを知りたい場合は気になりますか? –

+0

最初のケース。私はそれを防止したい。 – damluar

+0

あなたはそのことを知りたい理由を詳しく説明できますか?エンドユーザーにSQLクエリを直接入力させる計画ですか? –

答えて

1

一つの方法:

  1. Execute the query
  2. 更新が行われた場合、肯定応答、commit取引上のユーザチェック
  3. を行うupdate count
  4. を確認してください。否定的には、roll it back

バリエーションがあります。あなたのオプションを感じるには、Statement APIをご覧ください。

編集:autocommitがオフであること、またはトランザクション性がウィンドウ外にあることを確認してください!

編集:コメント者が指摘したように、これはスケーラブルな解決策ではありません。スケーラビリティのためには、トランザクションを短くしなければならず、開いているトランザクション中にユーザーの思考時間を持ちたくない場合があります。複数のユーザーがいる場合は、トランザクションを開いたままにして、これを実行する方法を見つけます。おそらく、文キャッシュとロールバック/コミットを創造的に使用します。より良いアドバイスのために、あなたの必要条件についてもっと説明してください。

+0

はい、良い選択肢です。二度ありがとう:) – damluar

+0

ユーザーは 'SET autocommit = 1;を実行することでハックすることができますので、うまく解決できません。 .....これは本当に安全ではありません。あなたが何をするかはあなた次第です。また、データベースへの他のすべての変更が 'commit'まで保留になっているので、悪い結果を出します。 –

+0

これは、ユーザが任意のクエリを実行できるのなら当てはまりますが、そうでないと仮定しています。そうでなければ、データベースブラウザを書いているだけです。同時使用に応じてパフォーマンスが問題になる可能性があります。私はそれを考えなかった。 –

3

クエリを確認しないでください。代わりに、データベースの変更が許可されていないユーザーの資格情報でクエリが実行されていることを確認してください。複数のユーザーを作成し、それぞれの制限付き権利を付与することができます。このアプリケーションは、データのみを選択できるユーザーを使用して接続する必要があります。

正確な方法は、使用するデータベースによって異なりますが、すべての現代のDBMSがこれをサポートしていると思います。

クエリを実行し、ユーザーの権限が不十分な場合に発生する可能性のある例外をキャッチし、確認後に別のユーザーを使用して接続できます。この方法で、データベースとその権利管理にすべてを任せています。これにより、照会の解析よりもはるかに安全でエラーの発生が少なくなります。

+0

私は尋ねたものに尋ねました。ありがとう、私はさまざまな役割とそれらにユーザーを割り当てることについて知っています。しかし、それは問題ではありません。 – damluar

+0

あなたの質問に答えるのではなく、私はあなたの問題の解決方法をあなたに提供すると思いました。私は助けになるかもしれない少し追加しましたが、むしろあなた自身でクエリを解析する場合は、先に進んでください。しかし、これを行うには、SQLの知識が必要です。選択クエリは必ずしもselectで始まるとは限りません。また、delete文とinsert文にはselectも含めることができます。そして、それらは一般的な例外だけです... – GolezTrol

+0

ありがとう、私は唯一の方法は解析することだと思います。しかし、そうでないことを望みました。 – damluar

0

私はJDBCの専門家ではないんだけど、私はこれを見ていたし、あなたに役立つことができます

http://www.techfeed.net/blog/index.cfm/2006/4/20/Obtaining-Affected-rows-from-SQL-Query

それはINSERT/UPDATE/DELETEによって影響を受けた行数を取得するためのいくつかのテクニックを提供しますステートメント。もちろん、それはCREATE/DROP TABLEなどのための多くの助けではありませんが、それは始まりです。

+0

ああ、ちょうどあなたが*実行前のステートメント*をインターセプトしたいと思っていました。じゃあ心配しないで! (これらは実行後に動作します)。 –

2

これはMySQLの権限で行うことをお勧めします。 2人のユーザーがいます.1人は読み取り専用アクセス権と読み取り/書き込み権限があります。

  1. SQLExceptionのユーザーのみ
  2. チェックを読んで、一つは、彼らが本当に第二のユーザを使用すると
  3. を書きたい場合は、あなたのメッセージを表示し、その後スローされた場合に、クエリを実行します。

これは、データベースに対するアクセス許可をプッシュしているため、これが最も安全な方法だと思います。それ以外の場合は、難しいかもしれない洗練されたSQLパーサを持っていなければなりません。

1

に依存します。 UPDATEまたはDELETE DBを変更する可能性があります。 データベースを変更するかどうかを知りたい場合は、INSERT,UPDATEDELETE、またはALTERというキーワードを大文字と小文字を区別しないで検索すると、クエリがデータベースを変更する可能性があります。 SELECT * FROM sometable WHERE something = 'update'のようなものは何も防げませんが、それに気をつけてください。クエリを実行する前に、変更が実際に行われるかどうかをお知りになりたい場合は

、すでにデータベース内のデータについて何かを知っている必要があるとしています。 SELECTと同じWHERE句をデータ変更可能なUPDATEまたはDELETEの文として使用し、データを比較します(これはJOINまたはその他のSQLの高度な機能を使用するクエリでは面倒なことがあります)。より簡単な方法は、use transactionsに変更を加え、変更をチェックしてから、トランザクションをロールバックして変更を元に戻すことです。

を変更した場合は、の変更を防ぐため、DBMSのロール管理を使用することをお勧めします。これらのクエリを実行するユーザーまたはロールに対して変更クエリを実行する権限を与えないことをお勧めします。

+0

ありがとう、良い考え – damluar

関連する問題