Как отличить операторы SQL, которые изменяют данные, от операторов, доступных только для чтения? - PullRequest
1 голос
/ 14 сентября 2010

Мне нужно написать оболочку драйвера, совместимую с jdbc, цель которого - записывать все операторы SQL, которые изменяют данные.Как проще всего отличить те операторы, которые изменяют данные, от тех, которые только читают данные?Я полагаю, что единственный способ - это анализ кода SQL на лету, какие библиотеки могут это сделать?

Ответы [ 3 ]

1 голос
/ 14 сентября 2010

Возможно, вы найдете несколько полноценных парсеров sql, таких как one , но если ваша оболочка будет перехватывать только отдельные операторы, вы можете (не достаточно подробно) рассматривать операторы SELECT только для чтения, а все остальное какоператоры, которые изменяют данные.

1 голос
/ 14 сентября 2010

Я думаю, что хорошее начало - поиск запросов, начинающихся с INSERT, UPDATE или DELETE. Обязательно обрежьте начальные пробелы перед проверкой строк.

Если вы хотите включить операторы изменения схемы, включите такие команды, как CREATE, ALTER, DROP и TRUNCATE.

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

0 голосов
/ 14 сентября 2010

Если это не оболочка общего назначения, я просто регистрирую каждый вызов методов executeXXX(), кроме вызовов executeQuery(), а затем просто вызываю метод подходящего в коде клиента.

Если вы хотите, чтобы он был универсальным, и хотели бы избежать синтаксического анализа SQL, вы можете исследовать метод getUpdateCount() и возвращаемые значения методов executeXXX(). Это подразумевало бы запись после инструкции, которая была выполнена, и я не думаю, что она будет на 100% правильной.

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