特定のクエリによってDBの状態が変更されると判断する方法を教えてください。 私はJDBCを使用しています。 INSERT、DELETEなどのキーワードを解析する構文解析を使用するか、その他の方法がありますか?クエリが変更されるかどうかの判断DB
答えて
一つの方法:
- Execute the query
- 更新が行われた場合、肯定応答、commit取引上のユーザチェック
- を行うupdate count
- を確認してください。否定的には、roll it back。
バリエーションがあります。あなたのオプションを感じるには、Statement APIをご覧ください。
編集:autocommitがオフであること、またはトランザクション性がウィンドウ外にあることを確認してください!
編集:コメント者が指摘したように、これはスケーラブルな解決策ではありません。スケーラビリティのためには、トランザクションを短くしなければならず、開いているトランザクション中にユーザーの思考時間を持ちたくない場合があります。複数のユーザーがいる場合は、トランザクションを開いたままにして、これを実行する方法を見つけます。おそらく、文キャッシュとロールバック/コミットを創造的に使用します。より良いアドバイスのために、あなたの必要条件についてもっと説明してください。
はい、良い選択肢です。二度ありがとう:) – damluar
ユーザーは 'SET autocommit = 1;を実行することでハックすることができますので、うまく解決できません。 .....これは本当に安全ではありません。あなたが何をするかはあなた次第です。また、データベースへの他のすべての変更が 'commit'まで保留になっているので、悪い結果を出します。 –
これは、ユーザが任意のクエリを実行できるのなら当てはまりますが、そうでないと仮定しています。そうでなければ、データベースブラウザを書いているだけです。同時使用に応じてパフォーマンスが問題になる可能性があります。私はそれを考えなかった。 –
クエリを確認しないでください。代わりに、データベースの変更が許可されていないユーザーの資格情報でクエリが実行されていることを確認してください。複数のユーザーを作成し、それぞれの制限付き権利を付与することができます。このアプリケーションは、データのみを選択できるユーザーを使用して接続する必要があります。
正確な方法は、使用するデータベースによって異なりますが、すべての現代のDBMSがこれをサポートしていると思います。
クエリを実行し、ユーザーの権限が不十分な場合に発生する可能性のある例外をキャッチし、確認後に別のユーザーを使用して接続できます。この方法で、データベースとその権利管理にすべてを任せています。これにより、照会の解析よりもはるかに安全でエラーの発生が少なくなります。
私は尋ねたものに尋ねました。ありがとう、私はさまざまな役割とそれらにユーザーを割り当てることについて知っています。しかし、それは問題ではありません。 – damluar
あなたの質問に答えるのではなく、私はあなたの問題の解決方法をあなたに提供すると思いました。私は助けになるかもしれない少し追加しましたが、むしろあなた自身でクエリを解析する場合は、先に進んでください。しかし、これを行うには、SQLの知識が必要です。選択クエリは必ずしもselectで始まるとは限りません。また、delete文とinsert文にはselectも含めることができます。そして、それらは一般的な例外だけです... – GolezTrol
ありがとう、私は唯一の方法は解析することだと思います。しかし、そうでないことを望みました。 – damluar
私はJDBCの専門家ではないんだけど、私はこれを見ていたし、あなたに役立つことができます
http://www.techfeed.net/blog/index.cfm/2006/4/20/Obtaining-Affected-rows-from-SQL-Query
それはINSERT/UPDATE/DELETEによって影響を受けた行数を取得するためのいくつかのテクニックを提供しますステートメント。もちろん、それはCREATE/DROP TABLEなどのための多くの助けではありませんが、それは始まりです。
ああ、ちょうどあなたが*実行前のステートメント*をインターセプトしたいと思っていました。じゃあ心配しないで! (これらは実行後に動作します)。 –
これはMySQLの権限で行うことをお勧めします。 2人のユーザーがいます.1人は読み取り専用アクセス権と読み取り/書き込み権限があります。
- SQLExceptionのユーザーのみ
- チェックを読んで、一つは、彼らが本当に第二のユーザを使用すると
- を書きたい場合は、あなたのメッセージを表示し、その後スローされた場合に、クエリを実行します。
これは、データベースに対するアクセス許可をプッシュしているため、これが最も安全な方法だと思います。それ以外の場合は、難しいかもしれない洗練されたSQLパーサを持っていなければなりません。
に依存します。 UPDATE
またはDELETE
DBを変更する可能性があります。 データベースを変更するかどうかを知りたい場合は、INSERT
,UPDATE
、DELETE
、またはALTER
というキーワードを大文字と小文字を区別しないで検索すると、クエリがデータベースを変更する可能性があります。 SELECT * FROM sometable WHERE something = 'update'
のようなものは何も防げませんが、それに気をつけてください。クエリを実行する前に、変更が実際に行われるかどうか、をお知りになりたい場合は
、すでにデータベース内のデータについて何かを知っている必要があるとしています。 SELECT
と同じWHERE
句をデータ変更可能なUPDATE
またはDELETE
の文として使用し、データを比較します(これはJOIN
またはその他のSQLの高度な機能を使用するクエリでは面倒なことがあります)。より簡単な方法は、use transactionsに変更を加え、変更をチェックしてから、トランザクションをロールバックして変更を元に戻すことです。
を変更した場合は、の変更を防ぐため、DBMSのロール管理を使用することをお勧めします。これらのクエリを実行するユーザーまたはロールに対して変更クエリを実行する権限を与えないことをお勧めします。
ありがとう、良い考え – damluar
- 1. EF4は、プロパティが実際に変更されたかどうかをどのように判断しますか?
- 2. データが変更されているかどうかを判断するためのカスタムハッシュコードの作成方法
- 3. バッファが変更されたかどうかを判断するvimrc関数とは何ですか?
- 4. デジタルオーディオデータがクリッピングされているかどうかを判断するアルゴリズム?
- 5. C#でファイル名が最後に変更された時期をどのように判断しますか?
- 6. STDERRがターミナルに向かうかどうかの判断
- 7. 私のアプリが更新されたかどうかを判断する最善の方法
- 8. 戻るボタンが表示されているかどうかはどのように判断できますか?
- 9. リンクが訪問されたかどうかを判断するにはどうすればよいですか?
- 10. location.hashが戻るボタンかどうかを判断する方法
- 11. デバイスにタッチスクリーンがあるかどうかを判断する
- 12. UIPrintInteractionControllerが表示されているかどうかをどのように判断できますか?
- 13. Javaでは、スレッドが実行されているかどうかをどのように判断しますか?
- 14. 抽象メソッドが実装されているかどうかはどのように判断できますか?
- 15. アイテムが選択されているかどうかはどのように判断しますか?
- 16. SPFileインスタンスが変換されたファイルであるかどうかを正確に判断する方法は?
- 17. Oracle:列が "ブール値"かどうかを判断する方法
- 18. オペレーティングシステムがMacであるかどうかを判断
- 19. ボタン/ウィンドウが有効かどうかを判断するwinforms C#
- 20. 単語が英語かどうかを判断するアルゴリズム?
- 21. パスワードが必要かどうかを判断する方法
- 22. F15が押されたかどうかはどのように判断できますか?
- 23. facebook graph apiユーザーがURLを好きかどうかを判断
- 24. どのライブラリが使用されていないかをどのように判断するのですか
- 25. DomainContextで何が変更されているかを判断する方法はありますか?
- 26. MongoDBでフルコレクションスキャンが行われたかどうかを判断する方法
- 27. SSMSでどのクエリがより効率的かを判断する方法2014
- 28. web.configが変更され、リロードする必要があるかどうかを判断する基準は何ですか?
- 29. Androidのバッテリーの状態はどのように判断されますか?
- 30. コマンドプロンプトを使用するかどうかを判断するバッチファイル
データベースが変更される可能性がある場合、または何かが実際に変更されるかどうかを知りたい場合は気になりますか? –
最初のケース。私はそれを防止したい。 – damluar
あなたはそのことを知りたい理由を詳しく説明できますか?エンドユーザーにSQLクエリを直接入力させる計画ですか? –