Не удается запустить «обновление базы данных dotnet ef» из-за недостаточных привилегий

#c# #sql-server #docker #entity-framework-core

#c# #sql-сервер #docker #entity-framework-core

Вопрос:

Я нахожусь в тупике с разработкой моего приложения .NET и настройкой базы данных.

Я использую образ контейнера docker mssql/sql-express . Я запустил его и могу войти в учетную запись системного администратора.

Я создал логин CommanderApi , базу CommanderDb данных и создал пользователя в этой базе данных с CommanderApi логином. Затем я создал начальную миграцию, и обновление завершается неудачно, когда я пытаюсь его запустить.

Что-то не так с моим подходом? Похоже, что идея дизайна, лежащая в основе использования фреймворка и сущности, заключается в том, что программисту требуется много шаблонного кода SQL. Однако в обучающем видео, которое я смотрю, они используют SSMS и выполняют все шаги, которые я описал выше — минус один шаг — предоставление учетных данных пользователя, которые в строке подключения моего приложения .NET регистрируются в достаточных разрешениях.

Когда я пытаюсь вручную предоставить CommanderApi пользователю разрешения на редактирование базы данных, я продолжаю получать синтаксические ошибки:

 Changed database context to 'CommanderDb'.  
 1> grant all on CommanderDb to 'CommanderApi'  
 2> go
 

Сообщение 102, уровень 15, состояние 1, сервер f69fca1fbe0b, строка 1
Неправильный синтаксис рядом с ‘CommanderApi’

 1> grant all on CommanderDb to 'CommanderApi'@'localhost'
2> go
 

Сообщение 102, уровень 15, состояние 1, сервер f69fca1fbe0b, строка 1
Неправильный синтаксис рядом с ‘CommanderApi’

 1> grant all on CommanderDb to CommanderApi
2> go
 

Сообщение 15151, уровень 16, состояние 1, сервер f69fca1fbe0b, строка 1
Не удается найти объект ‘CommanderDb’, потому что он не существует или у вас нет разрешения.

 mssql@f69fca1fbe0b:/$ /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P super_DUPER_password
1> grant all on CommanderDb to 'CommanderApi'@'localhost'
2> go
 

Сообщение 102, уровень 15, состояние 1, сервер f69fca1fbe0b, строка 1
Неправильный синтаксис рядом с ‘CommanderApi’.

 1> grant all on CommanderDb to CommanderApi@localhost
2> go
 

Сообщение 15151, уровень 16, состояние 1, сервер f69fca1fbe0b, строка 1
Не удается найти объект ‘CommanderDb’, потому что он не существует или у вас нет разрешения.

 1> delete CommanderDb
2> go
 

Сообщение 208, уровень 16, состояние 1, сервер f69fca1fbe0b, строка 1
Недопустимое имя объекта ‘CommanderDb’.

 1> drop CommanderDb
2> go
 

Msg 343, Level 15, State 1, Server f69fca1fbe0b, Line 1
Unknown object type ‘CommanderDb’ used in a CREATE, DROP, or ALTER statement.

 1> drop 'CommanderDb'
2> go
 

Msg 102, Level 15, State 1, Server f69fca1fbe0b, Line 1
Incorrect syntax near ‘CommanderDb’.

 1> drop database if exists 'CommanderDb'
2> go
 

Msg 102, Level 15, State 1, Server f69fca1fbe0b, Line 1
Incorrect syntax near ‘CommanderDb’.

 1> drop database if exists CommanderDb
2> go
1> exit
 

Error I get when trying to run dotnet ef database update

 C:UsersBenVsCode.netangular_templatecommander>dotnet ef database update
Build started...
Build succeeded.
 

fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
Failed executing DbCommand (28ms) [Parameters=[], CommandType=’Text’, CommandTimeout=’60’]
CREATE DATABASE [CommanderDb];
Failed executing DbCommand (28ms) [Parameters=[], CommandType=’Text’, CommandTimeout=’60’]
CREATE DATABASE [CommanderDb];
Microsoft.Data.SqlClient.SqlException (0x80131904): CREATE DATABASE permission denied in database ‘master’.

at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)
at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Booleanamp; dataReady)
at Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean isAsync, Int32 timeout, Boolean asyncWrite)
at Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 completion, Boolean sendToPipe, Int32 timeout, Booleanamp; usedCache, Boolean asyncWrite, Boolean inRetry, String methodName) at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary 2 parameterValues)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Create()
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

ClientConnectionId:d2819228-4d75-47ee-92f4-da88caa6a18f
Error Number:262,State:1,Class:14
CREATE DATABASE permission denied in database ‘master’.

C:UsersBenVsCode.netangular_templatecommander > docker exec -it sql-server-db «bash»
mssql@f69fca1fbe0b:/$ /opt/mssql-tools/bin/ sqlcmd -S localhost -U CommanderApi -P Commander9
Sqlcmd: Ошибка: драйвер Microsoft ODBC 17 для SQL Server: не удается открыть базу данных пользователя по умолчанию. Ошибка входа в систему..
Sqlcmd: Ошибка: драйвер Microsoft ODBC 17 для SQL Server: не удалось войти в систему для пользователя ‘CommanderApi’ ..
mssql@f69fca1fbe0b:/ $ /opt/mssql-tools/bin/ sqlcmd -S localhost -U SA -P super_Duper_password
Sqlcmd: Ошибка: драйвер Microsoft ODBC 17 для SQL Server: не удалось войти в систему для пользователь ‘SA’..
mssql@f69fca1fbe0b:/$ / opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P super_Duper_password
Sqlcmd: Ошибка: драйвер Microsoft ODBC 17 для SQL Server: не удалось войти в систему для пользователя ‘sa’..
mssql@f69fca1fbe0b:/$ /opt/mssql-tools/bin/sqlcmd -Локальный хост -U SA -P super_DUPER_password

Кто-нибудь знает, что я делаю не так? Ценю любую помощь.

мой docker-compose.yml

 version: "3.7"
services:
  sql-server-db:
    container_name: sql-server-db
    image: mcr.microsoft.com/mssql/server:2019-latest
    ports:
      - "1433:1433"
    environment:
      SA_PASSWORD: "super_DUPER_password"
      ACCEPT_EULA: "Y"

 

вероятно, очевидно, но это приложение в нерабочем режиме, поэтому ни одна из учетных данных не является действительной / безопасной

в разделе startup.cs мы добавили контекст БД с помощью D / I

 services.AddDbContext<CommanderContext>(options => options.UseSqlServer
                (Configuration.GetConnectionString("DefaultConnection")));

 

строка подключения

 "ConnectionStrings" : 
{   
    "DefaultConnection" : "Server=localhost,1433;Initial Catalog=CommanderDb;User ID=CommanderApi;Password=Commander9;"
}

 

Комментарии:

1. Это не имеет ничего общего с разрешениями, это не T-SQL. grant all on CommanderDb to 'CommanderApi'@'localhost' синтаксис MySQL. Вы использовали неправильный диалект. Например, эквивалент T-SQL предыдущему (при условии, что релевантный LOGIN и USER существующий) будет ALTER ROLE db_owner ADD MEMBER CommanderApi;

2. @Larnu Вероятно, вам следует сделать этот комментарий ответом.