SQL с сетью безопасности - PullRequest
0 голосов
/ 19 августа 2008

В моей фирме талантливые и умные сотрудники, которые работают очень усердно. Я хотел бы дать им инструмент выполнения 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.

Ответы [ 7 ]

2 голосов
/ 19 августа 2008

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

1 голос
/ 21 августа 2008

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

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

Автоматизировать Автоматизировать Автоматизировать.

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

Если этого не сделать, присвоение им идентификатора пользователя, имеющего только разрешения SELECT, может помочь: -)

0 голосов
/ 05 января 2009

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

0 голосов
/ 05 января 2009

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

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

0 голосов
/ 19 августа 2008

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

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

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

0 голосов
/ 19 августа 2008

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

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

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

0 голосов
/ 19 августа 2008

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

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