#c# #sql-server #entity-framework
#c# #sql-сервер #entity-framework
Вопрос:
Я пытаюсь работать с SQL Server 2012. У меня есть база данных, и мне нужно создать нового пользователя базы данных с помощью кода. Но я не справляюсь с этим.
Во-первых, это мой SQL-запрос
CREATE USER TestUser FOR LOGIN TestUser
В SQL Server это работает хорошо.
У меня есть этот код:
internal class ServerContext : DbContext
{
public ServerContext(DbContextOptions<ServerContext> options) : base(options) { }
}
<»’>
DbContextOptions<ServerContext> _options;
var optionsBuilder = new DbContextOptionsBuilder<ServerContext>();
var connectionString = string.Format(ConnectionString.ConnectString, url, dbName, login, password);
_options = optionsBuilder.UseSqlServer(connectionString).Options;
using (var context = new ServerContext(_options))
{
if (data.Count() == 0)
{
context.Database.ExecuteSqlCommand(Query.CreateDbUser, new SqlParameter("@Login", "user"));
}
}
<»’>
public static class Query
{
public static string CreateDbUser = "CREATE USER @Login FOR LOGIN @Login";
}
Этот запрос преобразуется в:
exec sp_executesql N'CREATE USER @Login FOR LOGIN @Login',N'@Login nvarchar(4)',@Login=N'User'
И я получаю эту ошибку:
Недопустимый синтаксис вокруг «@Login».
Я думаю, это связано с тем, что параметр «user» передается как строка и указывается в кавычках при выполнении запроса.
Ответ №1:
Вы не можете использовать приведенную ниже инструкцию, потому что переменная не может заменить имя объекта:
exec sp_executesql N'CREATE USER @Login FOR LOGIN @Login',N'@Login nvarchar(4)',@Login=N'User'
Это попытается создать вызываемого пользователя @Login
, что недопустимо. Вам нужно будет использовать динамический SQL:
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'CREATE USER ' QUOTENAME(@Login) N' FOR LOGIN ' QUOTENAME(@Login) N';';
EXEC sp_executesql @SQL;