Параметризовать имя таблицы в.NET/SQL?

Я нашел этот , который реализует «вертикальное» слияние.

Сначала вы должны выполнить такой запрос, используя SUBSTRING_INDEX и GROUP_CONCAT , чтобы получить последнее ненулевое значение, доступное в базе данных для каждого столбца. ]

SELECT 
    SUBSTRING_INDEX(GROUP_CONCAT(05Hz ORDER BY ID DESC SEPARATOR '@@INDEX@@'), '@@INDEX@@', 1) AS 05Hz,
    SUBSTRING_INDEX(GROUP_CONCAT(5Hz ORDER BY updated_at DESC SEPARATOR '@@INDEX@@'), '@@INDEX@@', 1) AS 5Hz
FROM
    table
LIMIT 1

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

10
задан Luke Girvin 3 January 2017 в 16:46
поделиться

5 ответов

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

Я предложил бы ограничить символы A-Z, a-z, 0-9, '.', '_' и '' - и затем использовал бы то, что соответствующее заключение в скобки для базы данных (например, [] для SQL Server, я верю) обернуть все это. Затем просто поместите его непосредственно в SQL.

Не совсем ясно, что Вы имели в виду об этом не быть риском Внедрения SQL - Вы подразумеваете, что имена будут в исходном коде и только в исходном коде? Если так, я соглашаюсь, что это делает вещи лучше. Вы даже, возможно, не должны делать заключение в скобки автоматически при доверии разработчикам, чтобы не быть кретинами (сознательно или не).

4
ответ дан 3 December 2019 в 19:36
поделиться

Вы не можете непосредственно параметризовать имя таблицы. Можно сделать это косвенно через sp_ExecuteSQL, но Вы могли бы точно также создать (параметризованный) TSQL в C# (связывающий имя таблицы, но не другие значения) и отправить его вниз как команду. Вы получаете ту же модель обеспечения безопасности (т.е. Вам нужны явный ВЫБОР и т.д. и предположение, что это не подписывается и т.д.).

Также - убедиться добавить имя таблицы в белый список.

6
ответ дан 3 December 2019 в 19:36
поделиться

Можно передать имя таблицы в качестве параметра как любой другой параметр. ключ - Вы, должны создать динамический sql оператор, который затем необходимо рассмотреть, легче ли создать его в уровне приложений или в procs.

create procedure myProc

@tableName nvarchar(50)

as

sp_executesql N'select * from ' + @tablename

к вашему сведению этот пример кода, из памяти взглянули на BOL для правильного синтаксиса sp_executesql.

Также это высоко sucesptible к Внедрению SQL, как Вы указали, не проблема для Вас, но любой читающий это должен очень опасаться принимать, что вход от пользователя генерирует их запросы как это.

4
ответ дан 3 December 2019 в 19:36
поделиться

Идея, что это не подвержено Внедрению SQL, дезинформирована. Это может быть менее подвержено Внедрению SQL от пользователей фронтэнда, но это все еще очень подвержено Внедрению SQL. Большинство нападений на базы данных происходит из нападения компании, не от конечных пользователей.

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

2
ответ дан 3 December 2019 в 19:36
поделиться

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

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

BTW, Вы дурачите себя, если Вы думаете, что это не риск для Внедрения SQL. При интерполяции имени таблицы в запрос динамично необходимо использовать выделенные идентификаторы вокруг имени таблицы, как Вы использовали бы кавычки вокруг строкового литерала, который интерполирован от переменной.

4
ответ дан 3 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: