Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Валидирунг SQL-строк, Можно ли 
:(
    Опции темы
Pankon
  Дата 11.10.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Можно ли узнать, что систаксис SQL-строки "правильный"?


PM MAIL   Вверх
sergejzr
Дата 11.10.2006, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



При компиляции - нет. Ведь строка может создаваться динамически в процессе выполнения программы. 
Единственный сбособ - распечатывать ошибку БД при выполнении запроса.

ПС:
По-русски это называется "валидация" smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Pankon
Дата 11.10.2006, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(sergejzr @  11.10.2006,  12:07 Найти цитируемый пост)
строка может создаваться динамически
 вот такую строку и надо проверить

Цитата(sergejzr @  11.10.2006,  12:07 Найти цитируемый пост)
ошибку БД при выполнении запроса
 а это-то и хотелось избежать

Неужели нет способа...

ПС. Писать синтаксический анализатор SQL-строки - не предлогать...
PM MAIL   Вверх
ivashkanet
Дата 11.10.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Pankon, так у VS вроде есть SQL анализатор  smile 
Вернее не анализатор, а SQL-builder вот в нем и проверь свою строку
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 11.10.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Цитата(Pankon @  11.10.2006,  11:22 Найти цитируемый пост)
ПС. Писать синтаксический анализатор SQL-строки - не предлогать... 

Зачем его писать, когда БД это делает.

Полюбому точно отвалидировать запрос может только сама БД. Их миллион разных и программно этого сделать невозможно (да и не надо в большинстве случаев.)
В мускуле например можно приписывать вначале запроса "EXPLAIN" тогда запрос выполняться не будет, но сообщение об ошибке(если таковая имеется) выдаст.
Но это всё уже при выполнении программы.
Вообще, если запрос один раз хорошо отлажен, проверять его каждый раз не имеет смысла.





--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Pankon
Дата 11.10.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(ivashkanet @  11.10.2006,  12:27 Найти цитируемый пост)
SQL-builder вот в нем и проверь свою строку 
Цитата(sergejzr @  11.10.2006,  12:30 Найти цитируемый пост)
Вообще, если запрос один раз хорошо отлажен, проверять его каждый раз не имеет смысла.
 строка генерируется программно, некоторые ее части зависят от того, что набрал пользователь... а некоторые, от того, что пользователь ввел...



Цитата(sergejzr @  11.10.2006,  12:30 Найти цитируемый пост)
и не надо в большинстве случаев
 это как раз тот случай, когда надо... Динамически сгенерированные строки передаются на несколько серверов, где и происходит коннект с базой данных, и если строки пошли "неправильные", то получать 10 сообшений (с каждого сервера) об неправильном SQL не хотелось бы...

PM MAIL   Вверх
ivashkanet
Дата 11.10.2006, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Pankon @  11.10.2006,  12:39 Найти цитируемый пост)
Динамически сгенерированные строки передаются на несколько серверов, где и происходит коннект с базой данных, и если строки пошли "неправильные", то получать 10 сообшений (с каждого сервера) об неправильном SQL не хотелось бы...

Ну так заведи тестовую таблицу и к ней обращайся ловя (или нет) по пути эксепшены. 
Или ты дебажить проект будешь на реальных серверах?
PM MAIL WWW ICQ   Вверх
Pankon
Дата 11.10.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(ivashkanet @  11.10.2006,  12:43 Найти цитируемый пост)
тестовую таблицу
 или тестовую базу данных... smile 

Цитата(ivashkanet @  11.10.2006,  12:43 Найти цитируемый пост)
Или ты дебажить проект будешь на реальных серверах? 
Приложение уже работает, только время от времени дает сбои(сообшения об ошибке на каждом сервере), по причине неверного ввода пользователями динамических частей SQL-строки

PM MAIL   Вверх
sergejzr
Дата 11.10.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Цитата(Pankon @  11.10.2006,  11:39 Найти цитируемый пост)
строка генерируется программно, некоторые ее части зависят от того, что набрал пользователь... а некоторые, от того, что пользователь ввел...

Это в 99,99% приложений так. Программно надо проверять отдельные части, чтобы не послать строку туда, где необходимо целое число, экранировать кавычки, итд.
В отлаженных запросах ошибки могут быть только логические но не синтактические!



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
ivashkanet
Дата 11.10.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Pankon @  11.10.2006,  12:55 Найти цитируемый пост)
или тестовую базу данных... 

Есть много вариантов:
1) Тестовая таблица в реальной БД на реальном сервере
2) Тестовая таблица в тестовой БД на реальном сервере
3) Тестовая таблица в реальной БД на тестовом сервере
4) Тестовая таблица в тестовой БД на тестовом сервере
Какой выбираешь?
Цитата(Pankon @  11.10.2006,  12:55 Найти цитируемый пост)
неверного ввода пользователями динамических частей SQL-строки

Пользователи сами вводят SQL-строки  smile Приложение для программистов?  smile 

Цитата(Pankon @  11.10.2006,  12:55 Найти цитируемый пост)
Приложение уже работает, только время от времени дает сбои(сообшения об ошибке на каждом сервере), по причине неверного ввода пользователями динамических частей SQL-строки

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

Добавлено @ 13:07 
Цитата(ivashkanet @  11.10.2006,  13:01 Найти цитируемый пост)
3) Тестовая таблица в реальной БД на тестовом сервере

Третий не катит  smile 
PM MAIL WWW ICQ   Вверх
Дрон
Дата 11.10.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(ivashkanet @  11.10.2006,  14:01 Найти цитируемый пост)
ользователи сами вводят SQL-строки  smile Приложение для программистов?  smile 

Во-во. Сам удивляюсь smile

Pankon, ты уж поаккуратней с "динамическими частями SQL-строки". А то мало ли у тебя там запросы вроде:
Код
string sql = string.Format("SELECT * FROM users WHERE login = '{0}' AND password = '{1}'", login, password);

Если так, то тут никакая проверка синтаксиса уже не поможет, ведь если я введу в качестве логина вот такое:
Код
'; TRUNCATE TABLE users; --

то синтаксис останется верным, а результат...  smile 

Это сообщение отредактировал(а) Дрон - 11.10.2006, 13:11


--------------------
Да. Именно так.
PM   Вверх
Pankon
Дата 11.10.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(ivashkanet @  11.10.2006,  13:01 Найти цитируемый пост)
Тестовая таблица
Цитата(ivashkanet @  11.10.2006,  13:01 Найти цитируемый пост)
Какой выбираешь?
в запросе несколько таблиц... (можно сказать - почти вся база)


Цитата(ivashkanet @  11.10.2006,  13:01 Найти цитируемый пост)
Приложение для программистов?
 некоторых можно так назвать


Цитата(sergejzr @  11.10.2006,  12:56 Найти цитируемый пост)
В отлаженных запросах
Цитата(ivashkanet @  11.10.2006,  13:01 Найти цитируемый пост)
оттестируй новый запрос
 все запросы, которые вводят пользователи из группы "так называемые Администраторы" предусмотреть невозможно, а им по определению(читай - техническое задание) должна быть доступна часть строки для динамического ввода... Большой процент ошибок, что вводят пользователи, такого характера  - "AND T1.F1=10 AND T2.F2=20 AND T3.F1=<30" smile Поэтому возник тут  такой вопрос

Добавлено @ 13:21 
Цитата(Дрон @  11.10.2006,  13:10 Найти цитируемый пост)
ты уж поаккуратней
 техническое задание не изменить...


Это сообщение отредактировал(а) Pankon - 11.10.2006, 13:22
PM MAIL   Вверх
ivashkanet
Дата 11.10.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Pankon @  11.10.2006,  13:19 Найти цитируемый пост)
в запросе несколько таблиц... (можно сказать - почти вся база)

Ааа, да, тута я тормазнул  smile 
Цитата(Pankon @  11.10.2006,  13:19 Найти цитируемый пост)
Большой процент ошибок, что вводят пользователи, такого характера  - "AND T1.F1=10 AND T2.F2=20 AND T3.F1=<30"... Поэтому возник тут  такой вопрос

Так предложи сделать "query builder", типа несколько выпадающих списков, как в Экселе, например, 

Первый список: "поле", второй: ">,<,<=,>=", третий: "значение".

P.S. Так проблемма в этом: "=<"? Взашей таких "админов" надо  smile 

PM MAIL WWW ICQ   Вверх
Pankon
Дата 11.10.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(ivashkanet @  11.10.2006,  13:25 Найти цитируемый пост)
сделать "query builder"
 эта идея у меня давно витает... но не для этого проекта...

Цитата(ivashkanet @  11.10.2006,  13:25 Найти цитируемый пост)
Взашей таких "админов"
 это "так называемые Администраторы" не компьютерных систем smile, а портала...

Добавлено @ 13:33 
Цитата(ivashkanet @  11.10.2006,  13:25 Найти цитируемый пост)
несколько выпадающих списков
 точнее сказать "несколько десятков"  smile 

PM MAIL   Вверх
Дрон
Дата 11.10.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Задача:
- проверить синтаксис SQL запроса, не выполняя его

Решение:
- нужно попытаться создать хранимую процедуру, содержащую предполагаемый запрос: при создании хранимой процедуры сервер проверит валидность её содержимого

Вот smile

ЗЫ: Кстати, а почему тема не в разделе про базы данных?

Это сообщение отредактировал(а) Дрон - 11.10.2006, 14:21


--------------------
Да. Именно так.
PM   Вверх
ivashkanet
Дата 11.10.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Дрон @  11.10.2006,  14:20 Найти цитируемый пост)
- нужно попытаться создать хранимую процедуру, содержащую предполагаемый запрос: при создании хранимой процедуры сервер проверит валидность её содержимого

А не накладно это будет? Ведь такие процедуры будут создаваться часто  smile 
PM MAIL WWW ICQ   Вверх
Дрон
Дата 11.10.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



ivashkanet, дык-ть как я понял проверка синтаксиса нужна не перед выполнением: непосредственно перед выполнением она вообще бессмысленна, т.к. все ошибки будут выявлены сразу.

Проверка нужна один раз -- в момент ввода запроса пользователем, чтобы сразу же сказать, что он туда какую-то ерунду ввёл.

Это сообщение отредактировал(а) Дрон - 11.10.2006, 14:31


--------------------
Да. Именно так.
PM   Вверх
Pankon
Дата 11.10.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(Дрон @  11.10.2006,  14:20 Найти цитируемый пост)
Кстати, а почему тема не в разделе про базы данных?
 Программирование-то под дот.нет...., где во FrameWork столько (без)дельных классов... Namespace System.Data например....

Цитата(Дрон @  11.10.2006,  14:20 Найти цитируемый пост)
попытаться создать хранимую процедуру
 а как? (имеется ввиду средствами дот.нет)

Добавлено @ 14:31 
Цитата(Дрон @  11.10.2006,  14:30 Найти цитируемый пост)
в момент ввода запроса пользователем
 ага

PM MAIL   Вверх
Дрон
Дата 11.10.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(Pankon @  11.10.2006,  15:30 Найти цитируемый пост)
Программирование-то под дот.нет...., где во FrameWork столько (без)дельных классов... Namespace System.Data например....

Но ведь вопрос про базы данных, а не про .net в частности.

Цитата(Pankon @  11.10.2006,  15:30 Найти цитируемый пост)
а как? (имеется ввиду средствами дот.нет)

А какая у тебя БД?
И что значит средствами .NET? Работа с базой всегда идёт через SQL smile

Для MSSQL Server я бы сделал так:
Код

            string sqlToVerify = "DROP DATABASE master"; // будем проверять не выполняя (и не вздумай выполнять!!!) 

            using (SqlConnection conn = new SqlConnection("server=localhost;integrated security=SSPI"))
            {
                conn.Open();

                string spName = "SP_" + Guid.NewGuid().ToString("N"); // уникальное имя

                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                try
                {
                    // попытаемся создать хр.пр.
                    cmd.CommandText = string.Format("CREATE PROCEDURE {0} AS {1};", spName, sqlToVerify);
                    cmd.ExecuteNonQuery();
                    
                    // если она нормально создалась, то надо её сразу и грохнуть :)
                    cmd.CommandText = string.Format("DROP PROCEDURE {0}", spName);
                    cmd.ExecuteNonQuery();
                }
                catch(SqlException ex)
                {
                    // значит синтаксис неверен 
                    MessageBox.Show(ex.Message);
                }
            }




Это сообщение отредактировал(а) Дрон - 11.10.2006, 14:46


--------------------
Да. Именно так.
PM   Вверх
sergejzr
Дата 11.10.2006, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Ну и для мускула smile 

Код

string sqlToVerify = "DROP DATABASE master"; // будем проверять не выполняя (и не вздумай выполнять!!!) 
            using (SqlConnection conn = new SqlConnection("server=localhost;user=root;password=0123456"))
            {
                conn.Open();
                string spName = "SP_" + Guid.NewGuid().ToString("N"); // уникальное имя
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                try
                {
                    // попытаемся создать хр.пр.
                    cmd.CommandText = string.Format("EXPLAIN {0};",  sqlToVerify);
                    cmd.ExecuteNonQuery();
                }
                catch(SqlException ex)
                {
                    // значит синтаксис неверен 
                    MessageBox.Show(ex.Message);
                }
            }



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Дрон
Дата 11.10.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



sergejzr, да, у них ещё проще -- только там будет не SqlConnection/SqlCommand, а свои классы с префиксом MySql smile

Для Oracle, кстати, тоже есть нечто подобное, только там чуть посложнее будет: просишь сервер посчитать план выполнения, и проверяешь посчитался ли он.


--------------------
Да. Именно так.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0697 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.