Как я могу создать и назначить пользователя SQL Server при создании базы данных времени выполнения EF Core? - PullRequest
1 голос
/ 15 апреля 2019

Мне нужно знать, как создать базу данных SQL Server и нового пользователя SQL Server, и назначить этого пользователя для базы данных как db_owner, когда мое приложение .NET Core впервые запускается с использованием миграций Entity Framework Core (в настоящее время эти шаги выполняется вручную перед первым развертыванием).

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

Я пытался внедрить Sql() команды в метод Up() моей первой миграции, но, поскольку строка подключения уже имеет учетные данные SQL Server пользователя, которого я пытаюсь создать вручную, вход в систему явно не удался .

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

Вот код Up(), который я пробовал:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.Sql("CREATE LOGIN svc_appname_env WITH PASSWORD = 'app_password'");
    migrationBuilder.Sql("CREATE USER [svc_appname_env] FOR LOGIN [svc_appname_env]");
    migrationBuilder.Sql("EXECUTE sp_addrolemember N'db_owner', N'svc_appname_env'");
    ...
}

В Startup.cs:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
    {
        var context = serviceScope.ServiceProvider.GetRequiredService<MyDatabaseContext>();
        context.Database.Migrate();
    }
    ...
}

Я ожидаю, что пользователь и база данных будут созданы, но вместо этого я получаю следующую ошибку:

Ошибка входа пользователя 'svc_appname_env'

...