Создание базы данных программно на SQL Сервере с параметрами - PullRequest
0 голосов
/ 19 марта 2020

На данный момент у меня есть рабочий кусок кода, который выглядит примерно так:

string sqlCreateDBQuery = " CREATE DATABASE "
                                  + "["+databaseName+"]"
                                  + " ON PRIMARY "
                                  + " (NAME = Data, "
                                  + " FILENAME = '" + strDataPath + databaseName + ".mdf', "
                                  + " FILEGROWTH = 1MB) "
                                  + " LOG ON (NAME = Log, "
                                  + " FILENAME = '" + strLogPath + databaseName + "_log.ldf', "
                                  + " FILEGROWTH = 10%) "
                                  + " COLLATE Latin1_General_CI_AS ;";

SqlCommand command = new SqlCommand(sqlCreateDBQuery, connection);

Это, с моим нынешним пониманием, потенциальная проблема SQL -инъекционных атак и хорошо , ошибки пользовательского ввода.

Итак, мой вопрос: как мне безопасно создать базу данных программно на SQL сервере, где пользователь может назвать базу данных?

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

Я также читал, что есть возможность использовать SQL API объекта управления сервером, как описано в этом ответе здесь: Создание базы данных программно в SQL Сервер

К сожалению, это не вариант для нас.

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

SqlCommand command = connection.CreateCommand();

command.CommandText = " CREATE DATABASE "
                              + "@dbName"
                              + " ON PRIMARY "
                              + " (NAME = Data, "
                              + " FILENAME = @dataPath, " 
                              + " FILEGROWTH = 1MB) "
                              + " LOG ON (NAME = Log, "
                              + " FILENAME = @logPath, " 
                              + " FILEGROWTH = 10%) "
                              + " COLLATE Latin1_General_CI_AS ;";

command.Parameters.AddWithValue("@dbName", StrDBName);
command.Parameters.AddWithValue("@dataPath", $"{strDataPath}{StrDBName}.mdf");
command.Parameters.AddWithValue("@logPath", $"{strLogPath}{StrDBName}_log.ldf");

Я также прочитал Здесь , что это должно быть возможно при использовании c SQL, но, к сожалению, все мои попытки либо заканчивались ошибками синтаксиса, либо параметрами не заменялись фактическими значениями.

Я что-то здесь упускаю или это просто не так тривиально, как я изначально думал

...