Возможно параметризованное СОЗДАНИЕ ПРЕДСТАВЛЕНИЯ?

StackOverflow https://stackoverflow.com/questions/259798

Вопрос

У меня есть база данных (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.Я бы также был очень осторожен при создании тела с помощью диманики.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top