#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(TaskCompletionSource1 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 Вероятно, вам следует сделать этот комментарий ответом.