SQL с сетью безопасности

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

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

К счастью, все их запросы - это SELECT, а не SQL, изменяющий данные, и они все равно работают с копией базы данных. Тем не менее, мы хотели бы предотвратить ошибки в SQL, который они запускают. Например, иногда ошибки приводят к длительным запросам, которые замедляют работу дублирующейся системы и причиняют неудобства другим, пока мы не найдем виновный запрос и не уничтожим его. Хуже того, иногда ошибки приводят к, по-видимому, правильным ответам, которые мы не улавливаем намного позже, с последующим смущением.

Наши разработчики также допускают ошибки в сложном коде, который они пишут, но у них есть Eclipse и различные плагины (такие как FindBugs ), которые ловят ошибки по мере их ввода. Я хотел бы дать операторам что-то подобное - в идеале это будет видно

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

и перед тем, как казнить, он скажет: «Эй, ты понял, что это декартово произведение? Ты уверен, что хочешь это сделать?» Это не должно быть очень умно - найти явно недостающие условия соединения и подобные очевидные ошибки было бы хорошо.

Похоже, что TOAD должен сделать это, но я не могу найти ничего о такой функции. Существуют ли другие инструменты, такие как TOAD, которые могут обеспечить полу-интеллектуальную коррекцию ошибок?

Обновление: я забыл упомянуть, что мы используем MySQL.

18.08.2008 23:58:10
7 ОТВЕТОВ

Вы можете найти SQL Prompt от redgate полезным. Я не уверен, какой движок базы данных вы используете, так как это только для MSSQL Server

0
19.08.2008 00:05:24

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

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

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

0
19.08.2008 02:42:37

Было бы довольно легко создать это, настроив пример базы данных с очень небольшим количеством фиктивных данных, которые сначала получат запрос. Пара вещей произойдет:

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

Предполагая, что ваша схема не сильно меняется и не особенно странна, написанное выше, вероятно, является самым быстрым решением вашей проблемы.

0
19.08.2008 02:48:05

Если ваши люди используют программу mysql (1) для выполнения запросов, вы можете использовать опцию safe-updates (она же i-am-a-dummy), чтобы получить часть того, что вам нужно. Его название несколько вводит в заблуждение; он не только предотвращает UPDATE и DELETE без WHERE (о чем вы не беспокоитесь), но также добавляет неявный LIMIT 1000 к операторам SELECT и прерывает операции SELECT, у которых есть объединения, и, по оценкам, рассматривает более 1 000 000 кортежей - идеально подходит для обескураживающие декартовы объединения.

2
19.08.2008 03:10:41

... "написание очень сложных специальных SQL-запросов .... они так заняты"

Опасность Уилл Робинсон!

Автоматизация Автоматизация Автоматизация.

В идеале, оперативную группу не следует ставить в такое положение, когда ей приходится писать запросы на лету в ситуации сильного стресса - это путь к катастрофе! Для них лучше создать библиотеку предварительно написанных сценариев, которые прошли соответствующее тестирование, чтобы убедиться, что он а) выполняет то, что вы хотите, б) предоставляет контрольный журнал в) имеет возможную функцию типа «отменить».

В противном случае может помочь предоставление им идентификатора пользователя, который имеет только разрешения SELECT :-)

1
21.08.2008 08:04:21

Я бы начал с некоторых стандартов кодирования - например, никогда не используйте тип соединения в вашем примере - это часто приводит к плохим результатам (особенно в SQL Server, если вы попытаетесь выполнить внешнее соединение таким образом, вы получите плохие результаты). требовать, чтобы они делали явные объединения.

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

0
5.01.2009 20:28:28

Разве вы не можете просто ограничить время выполнения запроса? Я не уверен насчет MySQL, но для SQL Server даже только анализатор запросов по умолчанию может ограничивать время выполнения запросов до истечения времени ожидания. Соедините это с ограниченными правами, чтобы они могли выполнять только запросы SELECT, и вы должны быть в значительной степени охвачены.

0
5.01.2009 20:35:32