• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Проверка Sql запроса

  • Автор темы kiruxan
  • Дата начала
K

kiruxan

Добрый день!

Незнает ли кто нибудь случаем как лучше проверить синтаксис sql запроса в LotusScript агенте перед выполнением? Используется субд db2 общение с базой происходит при помощи класса LCConnection. Результаты запросов получаются такие не слабые в несколько тысяч строк, поэтому проверить синтаксис попыткой выполнить запрос как-то не очень...
 
A

Akupaka

молодой человек, если ты получаешь результат при "неправильном запросе", то, значит, проверка синтаксиса тебе не поможет.
если бы синтаксис был неверным, то результата бы не было.
если возвращаются не те данные, которые ты надеешься получить, то ошибка в логике запроса! а не синтаксисе :)

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

kiruxan

А что если в некоторых ситуациях запросы вводит пользователь (о безопасности говорить не надо!) и надо проверить соответствует введенное синтаксису sql или нет...
 
A

Akupaka

А что если в некоторых ситуациях запросы вводит пользователь (о безопасности говорить не надо!) и надо проверить соответствует введенное синтаксису sql или нет...
ну, если не соотв., то при попытке выполнения будет ошибка, а если соотв., но логически неверен, то - проблема составителя.
в любом случае, независимо от кол-ва результата, необходимо выполнять проверку запроса.
тут разве что можно посоветовать использовать ограничение возвращаемого кол-ва в самом запросе, но повлияет ли это на производительность запроса в лучшую сторону не могу сказать (например, )
ну, либо, может быть кто-то еще что-то посоветует :)

если в некоторых ситуациях запросы вводит пользователь (о безопасности говорить не надо!)
не знаю как о безопасности, но о квалификации такого пользователя явно стоит подумать )) причем не разработчику, а тому, кто этого пользователя туда пускает :)
 
K

kiruxan

К сожалению db2 функция top не ведома, надо считать с помощью rowcount.
 
A

Akupaka

К сожалению db2 функция top не ведома, надо считать с помощью rowcount
к сожалению, я плохо знаком с сиквелом, но есть ведь инет! :)
вот к примеру пишут:


Select FIRST/TOP N rows in MS SQL, Oracle and DB2

How do you select the first N rows in various databases?

A quick thing to remember is that rows are not stored in any particular sequence in a database. They can be placed in random data blocks in the database without any order whatsoever. If a query returns X rows, they definitely do not mean that these rows are stored in exactly this same order. It is just that these rows have satisfied your select query and are being displayed in the order they are found (unless you specify an ORDER BY clause). So how do I obtain only the first N rows from a query which actually returns more than N rows?

Here is a quick overview of how it can be done.

MS SQL
SELECT TOP 10 name, description
FROM TABLEA
ORDER BY name

The above query will return the first 10 rows sorted by name. How do I get the bottom 10 rows? Use the DESC keyword in the ORDER BY clause and it will sort it in reverse order.

ORACLE
SELECT name, description
FROM TABLEA
WHERE rownum <=10
ORDER BY NAME


One has to be careful when trying a similar thing in ORACLE. The above code will not work, simply because the query will return the first 10 rows and then order them, which is definitely not what you wanted. ROWNUM is a pseudo column that is assigned values based on the results returned. So the above code would have worked if there was no ORDER BY clause. The right way would be:
SELECT * FROM
(SELECT name, description
FROM TABLEA
ORDER BY NAME)
WHERE rownum <=10


A good resource for various questions on Oracle is:



DB2
SELECT name, description
FROM TABLEA
ORDER BY NAME
FETCH FIRST 10 ROWS ONLY
OPTIMIZE FOR 10 ROWS

вот. только в твоем случае, вероятно, следует избегать ORDER BY, что должно выводить лишь первые N-записей в таблице, без предварительного поиска и сортировки среди всех записей таблицы! думаю, что это сильно повлияет на скорость!
можешь даже проверить и сказать нам результат! :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!