Параметризованный CREATE VIEW возможен? - PullRequest
0 голосов
/ 03 ноября 2008

У меня есть база данных (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{ ... }".

То, как это кодируется прямо сейчас, заключается в объединении строк, как в ответе friol , но это вообще не выполняет санитарную обработку. Я бы почувствовал себя лучше, если бы мог хотя бы почистить его для подозрительных персонажей, например; или - или что у тебя. Я надеялся, что может быть библиотечная функция, которая сделает для меня скраб, или что-то в этом роде.

Ответы [ 4 ]

4 голосов
/ 03 ноября 2008

Параметры - это не просто подстановки строк. Вот почему ваш код не будет работать.

Это как вы не можете сделать

sql = "выбрать * из заказов, где orders_id in (?)"

и передайте "1,2,3,5" в качестве параметра.

Параметры проверяются типом и могут содержать только скалярные значения IIRC.

1 голос
/ 03 ноября 2008

SQL-инъекция. Вы хотите этого, в этом все дело. Вы должны объединить этот материал.

1 голос
/ 03 ноября 2008

Возможно, я не правильно понял, но что мешает вам сделать:

viewname="foo";
viewwhere="* from bar";

SqlCommand cmd = new SqlCommand("CREATE VIEW "+viewname+" AS SELECT "+viewwhere);
0 голосов
/ 03 ноября 2008

Мне кажется, что вы пытаетесь создать динамический запрос, используя параметры, а это не то, как параметризованный запрос предназначен для работы. Они не просто объединяются в строку.

Если вы пытаетесь предотвратить внедрение SQL-кода, я хотел бы проверить, что имя представления содержит только буквенно-цифровые символы и не содержит ключевых слов T-SQL. Я бы тоже очень осторожно отнесся к тому, чтобы создать тело в духе.

...