powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / [MSSQL/t-sql] Можно ли передать имя таблицы в виде параметра запроса
8 сообщений из 8, страница 1 из 1
[MSSQL/t-sql] Можно ли передать имя таблицы в виде параметра запроса
    #40069778
Vadim S. Adamlyuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,

Пишу на golang, обращаюсь к MSSQL с ипользованием go-mssqldb, но как я понял, проблема не относится ни к языку программирования, ни к библиотеке, по крайней мере встречал похожие проблемы и на C#

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

Пытаюсь сделать такой запрос:
Код: sql
1.
db.QueryContext(ctx, "select cont(*) as CNT from @TABLE_NAME", sql.Named("TABLE_NAME", "Test"))



Сообщение об ошибке:
mssql: Must declare the table variable "@TABLE_NAME".

На запрос вида:
Код: sql
1.
db.QueryContext(ctx, "select cont(*) as CNT from [@TABLE_NAME]", sql.Named("TABLE_NAME", "Test"))


ошибка:
mssql: Invalid object name '@TABLE_NAME'

Может у кого-нибудь был опыт или есть идеи как передавать имя таблицы в виде параметра?
...
Рейтинг: 0 / 0
[MSSQL/t-sql] Можно ли передать имя таблицы в виде параметра запроса
    #40069785
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EXECUTE (Transact-SQL)

См. Пример В.
...
Рейтинг: 0 / 0
[MSSQL/t-sql] Можно ли передать имя таблицы в виде параметра запроса
    #40069813
Vadim S. Adamlyuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
EXECUTE (Transact-SQL)

См. Пример В.


Спасибо, работает.
Привожу тут ответ для тех, кто будет искать после меня:

Код: sql
1.
db.QueryContext(ctx, "EXECUTE('select cont(*) as CNT from ' + @TABLE_NAME)", sql.Named("TABLE_NAME", "Test"))



Правда, я призадумался: а ведь при таком запросе не будет никакой защиты от SQL injection... :-/
...
Рейтинг: 0 / 0
[MSSQL/t-sql] Можно ли передать имя таблицы в виде параметра запроса
    #40069826
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim S. Adamlyuk
Использую именованные параметры запросов для того, чтобы бороться с SQL injection
Чуток поправил.Но у меня есть проблема, заключающаяся в том, что имя таблицы задается в конфигурационном файле и, соответсвенно, его тоже нужно по-хорошему проверять на SQL injection.Вместо дурацкого динамического запроса к (проверяемому) объекту, делайте "обычные" запросы к схеме, чтобы убедиться, что объект интересующего вас типа (таблица или представление) - существует. В этом случае тоже будут некоторые проблемы с регистром написания имени, но решаются они на порядки проще.
...
Рейтинг: 0 / 0
[MSSQL/t-sql] Можно ли передать имя таблицы в виде параметра запроса
    #40069834
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim S. Adamlyuk
Akina
EXECUTE (Transact-SQL)

См. Пример В.


Спасибо, работает.
Привожу тут ответ для тех, кто будет искать после меня:

Код: sql
1.
db.QueryContext(ctx, "EXECUTE('select cont(*) as CNT from ' + @TABLE_NAME)", sql.Named("TABLE_NAME", "Test"))



Правда, я призадумался: а ведь при таком запросе не будет никакой защиты от SQL injection... :-/
Не будет. Именно в SQL injection ты и вляпался всеми ногами и руками.

Вообще, задача изначально стоит криво. Не надо делать выбор какую таблицу читать. Если у тебя есть задача разделить некие похожие данные "по таблицам", то сделай одну общую таблицу для всех этих данных и добавь в нее поле которое и будет играть роль твоей нынешней @TABLE_NAME (ну и сделай его частью ПК). А дальше стандартными параметрическими запросами, не забывая указывать какую из виртуальных таблиц тебе сейчас надо использовать.
...
Рейтинг: 0 / 0
[MSSQL/t-sql] Можно ли передать имя таблицы в виде параметра запроса
    #40069837
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim S. Adamlyuk
Правда, я призадумался: а ведь при таком запросе не будет никакой защиты от SQL injection... :-/

QUOTENAME

Код: sql
1.
db.QueryContext(ctx, "EXECUTE('select cont(*) as CNT from ' + QUOTENAME(@TABLE_NAME))", sql.Named("TABLE_NAME", "Test"))
...
Рейтинг: 0 / 0
[MSSQL/t-sql] Можно ли передать имя таблицы в виде параметра запроса
    #40069870
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... а потом окажется, что "в файле конфигурации" имя таблицы записано строчными, а для идентификаторов в кавычках преобразование регистра не делается.
...
Рейтинг: 0 / 0
[MSSQL/t-sql] Можно ли передать имя таблицы в виде параметра запроса
    #40086308
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы не было инжекшинов, можно использовать sp_executesql, а так, обычно, помогает замена одинарной кавычки на две одинарные.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / [MSSQL/t-sql] Можно ли передать имя таблицы в виде параметра запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]