Определение того, изменит ли запрос БД - PullRequest
0 голосов
/ 23 августа 2011

Как я могу определить, что конкретный запрос изменит состояние БД?Я использую JDBC.Нужно ли использовать синтаксический анализ для поиска ключевых слов, таких как INSERT, DELETE или есть другие способы?

Ответы [ 5 ]

3 голосов
/ 23 августа 2011

Не проверяйте запрос.Вместо этого убедитесь, что запрос выполняется с учетными данными пользователя, которым не разрешено изменять базу данных.Вы можете создать несколько пользователей и предоставить каждому ограниченные права.Это приложение должно подключаться с использованием пользователя, который может выбирать только данные.

Точный способ (и если это вообще возможно) зависит от используемой вами базы данных, но я думаю, что каждая современная СУБД поддерживает это.

Вы можете выполнить запрос, поймать исключение, которое вы, вероятно, получите, когда у пользователя недостаточно прав, и после подтверждения вы можете подключиться, используя другого пользователя.Таким образом, вы оставляете все это для базы данных и ее управления правами, что намного безопаснее и менее подвержено ошибкам, чем сам анализ запросов.

2 голосов
/ 23 августа 2011

Я предлагаю сделать это с разрешениями MySQL. Иметь двух пользователей, один с доступом только для чтения и с правом чтения / записи

  1. Выполнить запрос только для чтения.
  2. Проверьте на SQLException и, если один из них брошен, покажите ваше сообщение, если они действительно хотят написать
  3. Тогда воспользуйтесь вторым пользователем.

Это, я думаю, самый безопасный способ, потому что вы выдвигаете разрешение на базу данных. В противном случае вам понадобится сложный синтаксический анализатор SQL, который может быть трудным.

1 голос
/ 23 августа 2011

Зависит.UPDATE или DELETE может изменить БД.Если вы хотите узнать, может ли изменить базу данных, поиск без учета регистра для ключевых слов INSERT, UPDATE, DELETE или ALTER скажет вам, что есть вероятностьзапрос на изменение базы данных.Хотя ничто не мешает что-то вроде SELECT * FROM sometable WHERE something = 'update', так что следите за этим.

Если вы хотите узнать , будет ли действительно выполнено изменение , перед выполнением запроса вам нужно будет кое-что узнать о данных, уже находящихся в базе данных.Выполните SELECT, используя то же предложение WHERE, что и потенциально изменяющий данные оператор UPDATE или DELETE, и сравните данные, например (это может привести к путанице в запросах, использующих JOIN или другие более сложныеособенности SQL).Более простым способом было бы использовать транзакции , чтобы внести изменения, проверить изменения, а затем откатить транзакцию, отменив изменения.

Если вы хотите предотвратить изменения , как показывают другие ответы, вам следует использовать управление ролями в вашей СУБД и не давать разрешения на выполнение изменяющихся запросов пользователю или роли, выполняющей эти запросы.

1 голос
/ 23 августа 2011

В одну сторону:

  1. Выполнить запрос
  2. Проверить количество обновлений
  3. Если обновления сделаны, сделайте, чтобы ваш пользователь проверил
  4. В случае положительного ответа, совершите транзакцию.Отрицательно, откат .

Будут вариации.Изучите Заявление API , чтобы почувствовать свои возможности.

Редактировать: Убедитесь, что autocommit выключен или транзакционность отсутствует в окне!

Больше править: Как отметили комментаторы, это не масштабируемое решение.Для масштабируемости транзакции должны быть короткими, и вы не хотите, чтобы пользователь размышлял во время открытой транзакции.Если будет несколько пользователей, найдите способ сделать это, не включающий удержание транзакции открытой, возможно, с некоторым творческим использованием кэширования операторов и откатов / фиксаций.Для лучшего совета объясните больше о ваших требованиях.

0 голосов
/ 23 августа 2011

Я не эксперт JDBC, но я видел это и мог бы помочь вам:

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

Это дает некоторые методы для получения количества строк, на которые влияетВСТАВИТЬ / ОБНОВИТЬ / УДАЛИТЬ операторы.Конечно, это не очень помогает для CREATE / DROP TABLE и т. Д. Но это только начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...