Regex для извлечения столбцов обновления из оператора Sql - PullRequest
1 голос
/ 14 января 2009

Мне нужен оператор Regex (выполняется на c #), который будет принимать строку, содержащую оператор обновления Sql, в качестве входных данных и будет возвращать список столбцов, которые необходимо обновить. Он должен уметь обрабатывать столбцы, заключенные в скобки, или нет.

// Example Sql Statement
Update Employees
Set FirstName = 'Jim', [LastName] = 'Smith', CodeNum = codes.Num
From Employees as em
Join CodeNumbers as codes on codes.EmployeeID = em.EmployeeID

В конце я хотел бы вернуть IEnumerable или List, содержащий:

  1. 1007 * FirstName *
  2. LastName
  3. CodeNum

У кого-нибудь есть хорошие предложения по реализации?

Обновление : sql генерируется пользователем, поэтому я должен проанализировать Sql, как он задан. Целью извлечения имен столбцов в моем случае является проверка того, что у пользователя есть разрешение на обновление столбцов, включенных в запрос.

Ответы [ 3 ]

3 голосов
/ 14 января 2009

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

Если вам абсолютно необходимо извлечь имена столбцов из оператора SQL, я не думаю, что регулярные выражения - это правильный путь. Например, в общем случае вам может потребоваться пропустить новые выражения значений, которые содержат произвольно вложенные скобки. Вы, вероятно, захотите полный анализатор SQL. В книге Lex & Yacc Левина, Мейсона и Брауна есть глава о разборе SQL.

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

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

2 голосов
/ 14 января 2009

Регулярные выражения не могут выполнить эту задачу, потому что SQL не является регулярным языком .

Вы можете сделать это, но не с помощью регулярного выражения. Вам нужен полноценный парсер.

Вы можете использовать ANTLR для генерации парсеров в C #, и есть бесплатные грамматики , доступные для синтаксического анализа SQL в ANTLR.

Однако я согласен с Glomek в том, что разрешать запуск пользовательского SQL на вашей системе даже после того, как вы попытались проверить, что он не содержит «несанкционированных действий», глупо. Слишком много дел могут обойти вашу проверку.

Вместо этого, если у вас есть только одно текстовое поле, вы должны определить упрощенный Специфичный для домена язык , который позволяет пользователям указывать только те действия, которые им разрешено выполнять. Из этого ввода вы можете построить SQL самостоятельно.

0 голосов
/ 08 января 2012

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

Почему бы не использовать анализатор SQL для достижения того, что вам нужно, вот статья показывает, как добиться того, что вам нужно в течение 3 минут.

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