Возможна ли параметризация СОЗДАТЬ ВИД?

У меня есть база данных (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? В некоторых случаях в теле запроса мог быть пользовательский ввод, и я чувствовал бы себя в большей безопасности, если бы мог сказать «рассматривать это как тело единственного оператора выбора». Может, то, о чем я прошу, слишком странно?


FOLLOWUP 04 Nov: OK, yes, what I want is sort of like SQL injection when you get down to it, but I would like to at least minimize (if not totally remove) the option of running this command and dropping a table or something. Granted, the user this is running as doesn't have permissions to drop any tables in the first place, but I think you get the idea. I'd love to have a way of saying, in effect, "This statement will not alter any existing data in any way{ ... }".

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
1 675
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

SqlCommand cmd = new SqlCommand("CREATE VIEW "+viewname+" AS SELECT "+viewwhere);

Это безопасно? Предотвращает ли это SQL-инъекцию?

DJ. 03.11.2008 23:37

Что ж, вы даете пользователю возможность написать любой запрос. Это определение SQL-инъекции :)

Gabriele D'Antona 03.11.2008 23:45

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

Это как ты не можешь

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

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

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

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

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

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

Другие вопросы по теме