2010-01-06 2 views
4

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

Некоторые клоун мог бы написать что-то вроде:

select * from big_table where 
Name in (select name from some_table where name like '%search everything%') 
or name in ('a', 'b', 'c') 
or price < 20 
or price > 40 
or exists (select 1 from some_other_table where col1 + col2 + col3 = 4) 
or exists (select 1 from table_a, table+b) 

Очевидно, это не отличный способ запросить эти таблицы с вычисленными значениями, неиндексированными столбцами, множеством OR и неограниченным соединением на table_a и table_b.

Но для пользователя это может иметь общий смысл.

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

Я предполагаю, что это программный способ в C#/sql-server, чтобы получить план выполнения запроса до его запуска. И если да, то какие факторы способствуют стоимости? Расчетная стоимость ввода-вывода? Расчетная стоимость процессора? Каковы были бы разумные пределы, чтобы сообщить пользователю, что его запрос не подходит?

EDIT: Мы являемся компанией, занимающейся исследованиями рынка. У нас есть тысячи опросов, каждый из которых имеет свои собственные данные. У нас есть десятки исследователей, которые хотят разрезать эти данные произвольным образом. У нас есть инструменты, позволяющие им создавать «допустимые» фильтры с помощью графического интерфейса, но некоторые «опытные пользователи» хотят предоставить свои собственные запросы. Я понимаю, что это не стандартная или лучшая практика, но как еще я могу позволить десяткам пользователей запрашивать таблицы для строк, которые они хотят, используя произвольно сложные условия и постоянно меняющиеся условия?

+0

В дополнение к ответам, предлагающим некоторый слой между клиентом и написанием предложений WHERE, как насчет создания представлений для общих запросов? – Zwergner

+2

Я бы скопировал данные в хранилище данных и попросил пользователей проанализировать данные там, где это безопасно. – CaffGeek

ответ

3

Вы можете попробовать использовать следующее:

SET SHOWPLAN_ALL ON 
GO 
SET FMTONLY ON 
GO 
<<< Your SQL code here >>> 
GO 
SET FMTONLY OFF 
GO 
SET SHOWPLAN_ALL OFF 
GO 

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

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

0

Я думаю, вы никогда не слышали об атаках SQL Injection? Что делать, если пользователь вводит команду DROP DATABASE после предложения WHERE?

+0

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

+0

Действующая озабоченность, но на самом деле не ответ на вопрос. – Zwergner

+5

Я был бы осторожен в предположении, что сотрудники никогда не злонамерены ... :) –

1

Вместо того, чтобы позволить сотрудникам напрямую писать (добавлять) запросы, а затем пытаться рассчитать стоимость запроса перед его запуском, почему бы не создать какой-либо элемент расширенного поиска или фильтра, который НЕ записывает SQL, который вы не можете контролировать?

5

Предпосылка Ваш вопрос гласит:

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

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

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

Однако, если ваши пользователи действительно являются сложными (и доверенными!), Достаточными для непосредственного предоставления предложений WHERE, их нужно обучать тому, что они могут и не могут представить в качестве фильтра.

+0

Согласен. Если действительно действительно необходимо, чтобы пользователи могли напрямую запрашивать запросы (сумасшедшие!), Тогда образование - лучший маршрут. –

0

Именно по этой причине прямое разрешение SELECT почти никогда не предоставляется пользователям в подавляющем большинстве приложений.

Лучше всего было бы разработать ваше приложение вокруг прецедентов, чтобы вы могли покрыть разумный процент требований с помощью специально разработанных фильтров/агрегатов/макетов.

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

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

2

Кроме того, чтобы попытаться контролировать то, что вводит пользователь (это будет битва, всегда будет новый прокат, который придумает впечатляющий запрос), я бы посмотрел на Resource Governor, см. Managing SQL Server Workloads with Resource Governor. Вы помещаете специальные запросы в отдельный пул и закрываете выделенные ресурсы. Таким образом, вы можете уменьшить проблему, ограничив количество повреждений, которые могут возникнуть в плохом запросе, до других задач.

И вы также должны рассмотреть возможность предоставления доступа к данным другими способами, например Power Pivot, и позволить пользователям массировать свои данные так же сильно, как они хотят в своем собственном Excel. Бизнес-пользователям это нравится, а влияние на сервер обработки транзакций минимально.

1

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

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

1

Вы можете создать модель данных для своей базы данных и позволить пользователям использовать построитель отчетов SQL Reporting Services. Его GUI-based и не требует написания предложений WHERE, поэтому должен быть предел того, сколько урона они могут сделать.

Или вы могли бы склад копию БД с целью пользовательских запросов, обновление БД каждый час или около того, и пусть они идут в город ... :)

0

(Чад упомянул об этом в комментарии , но я думаю, что он заслуживает ответа.)

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

1

Я работал в нескольких местах, где это тоже пришло. То, что мы закончили, - это НЕ разрешать пользователям неограниченный доступ и обещать, что ИТ сделает все возможное, чтобы предоставлять запросы, когда это необходимо. Проблема заключалась в том, что база данных довольно сложна, и даже если пользователи могут писать грамматически и синтаксически правильно SQL, они не обязательно понимают отношения между таблицами. Другими словами, даже если бы они могли написать свой собственный SQL, они получили бы неправильные ответы. Мы убедили пользователей в том, что риск принятия неправильного решения на основании ошибочного или неполного понимания 200 таблиц в базе данных был слишком высоким. Лучше получить правильный ответ после дня, чем не тот, который мгновенно.

Другая часть этого - то, что делает ИТ, когда пользователь A пишет запрос и получает 1 ответ, тогда пользователь B пишет, что он думает, является одним и тем же запросом и получает другой ответ? Это ИТ-задача найти различия? Исправить обе части SQL? и т. д. Суть в том, что я не позволил бы им получить доступ. Я бы загрузил систему с предопределенными запросами, как говорили другие, и попытайтесь обучить mgmt, почему это единственный способ, которым это будет работать в долгосрочной перспективе.

1

Если у вас есть так много данных, и вы хотите, чтобы предоставить своим клиентам возможность анализировать и просматривать информацию, как они хотят, я сильно Recommand на вещь о OLAP технологии.

Смежные вопросы