Возможно параметризованное СОЗДАНИЕ ПРЕДСТАВЛЕНИЯ?
-
06-07-2019 - |
Вопрос
У меня есть база данных (SQL Server 2005), в которой я хотел бы создавать представления "на лету".В моем коде я создаю инструкцию CREATE VIEW , но единственный способ заставить ее работать - это создать всю строку запроса и запустить ее в чистом виде.Я бы хотел использовать параметры, но это:
SqlCommand cmd = new SqlCommand("CREATE VIEW @name AS SELECT @body");
cmd.Parameters.AddWithValue("@name", "foo");
cmd.Parameters.AddWithValue("@body", "* from bar");
сообщает мне, что есть ошибка "рядом с ключевым словом VIEW" (предположительно, "@name") - излишне говорить "CREATE VIEW foo AS SELECT * FROM bar"
работает как чемпион.
Неужели это просто невозможно?Если нет, есть ли лучший способ очистить входные данные перед запуском инструкции CREATE?В некоторых случаях тело запроса может содержать пользовательский ввод, и я бы просто чувствовал себя в большей безопасности, если бы был какой-то способ, которым я мог бы сказать: "рассматривайте это как тело одного оператора select".Может быть, то, о чем я прошу, просто слишком странно?
ПРОДОЛЖЕНИЕ 04 Ноября:Хорошо, да, то, что я хочу, это что-то вроде SQL-инъекции, когда вы приступаете к этому, но я хотел бы, по крайней мере, свести к минимуму (если не полностью удалить) возможность запуска этой команды и удаления таблицы или чего-то еще.Конечно, пользователь, от имени которого это выполняется, изначально не имеет прав на удаление каких-либо таблиц, но я думаю, вы поняли идею.Я бы хотел иметь способ сказать, по сути,
"This statement will not alter any existing data in any way{ ... }"
.
Способ, которым это закодировано прямо сейчас, заключается в выполнении конкатенации строк, как в фриолэто ответ, но это вообще не приводит к дезинфекции.Я бы чувствовал себя лучше, если бы мог хотя бы почистить его от подозрительных персонажей, таких как ;или ... или что у тебя есть.Я надеялся, что там может быть библиотечная функция, которая сделает очистку за меня, или что-то в этом роде.
Решение
Может быть, я не совсем правильно понял, но что вам мешает сделать:
viewname="foo";
viewwhere="* from bar";
SqlCommand cmd = new SqlCommand("CREATE VIEW "+viewname+" AS SELECT "+viewwhere);
Другие советы
Параметры - это не просто подстановки строк.Вот почему ваш код не будет работать.
Это то, чего ты не можешь сделать
sql = "выбрать * из заказов, где orders_id в (?)"
и передайте "1,2,3,5" в качестве параметра.
Параметры проверяются по типу и могут содержать только скалярные значения IIRC.
SQL-инъекция.Ты хочешь этого, вот в чем суть.Вы должны объединить эти материалы.
Мне кажется, что вы пытаетесь создать динамический запрос с использованием параметров, а это не то, как должен работать параметризованный запрос.Они не просто объединяются в строку.
Если то, что вы пытаетесь предотвратить, - это внедрение SQL, то я бы проверил, что имя представления содержит только буквенно-цифровые символы и не содержит ключевых слов T-SQL.Я бы также был очень осторожен при создании тела с помощью диманики.