Créer une connection Azure db à partir du code triggers SqlException

Je souhaite créer une nouvelle connection à la database pour mon server de database Azure. Cela fonctionne lorsque vous utilisez SQL Management Studio mais pas à partir du code C # et je n'arrive pas à comprendre quel est le problème.

La documentation Azure Manage Database Logins montre comment procéder:

-- first, connect to the master database CREATE LOGIN login1 WITH password='<ProvidePassword>'; CREATE USER login1User FROM LOGIN login1; EXEC sp_addrolemember 'dbmanager', 'login1User'; EXEC sp_addrolemember 'loginmanager', 'login1User'; 

Encore une fois – cela fonctionne comme un charme tant que j'utilise SQL Management Studio. Maintenant, je veux faire la même chose avec le code. S'il vous plaît jeter un oeil à mon code:

 // This is ConnectionSsortingng to master database. // 'User ID' in this ssortingng is sa login created in Azure Portal. var cs = "Server=tcp:XXX.database.windows.net,1433;Database=master;User ID=XXX@XXX;Password=XXX;Encrypt=True;TrustServerCertificate=False;Connection Timeout=240"; // SQL command var command = "CREATE LOGIN testLogin WITH password = 'Test123!!!'"; // Execute command using cs using (var context = new MyDataContext(cs)) { // works fine - I am connected to the master db context.Database.Connection.Open(); // this line throws exception // "CREATE TABLE permission denied in database 'master'" context.Database.ExecuteSqlCommand(command); } 

Comme vous pouvez le voir, j'ai essayé 1: 1 comme le dit le doc mais ça ne marche pas. En faisant exactement la même chose dans SQL Management Studio, cela fonctionne. J'ai également essayé le bon vieux SqlConnection pour être sûr qu'il n'est pas causé par Entity Framework mais cela ne change rien.

Je ne sais pas quelle est la différence ici. Est-ce que je manque quelque chose? Des indices à ce sujet?

EDIT1: Voici l'exception.

Message:

 CREATE TABLE permission denied in database 'master'. 

La source:

 .Net SqlClient Data Provider 

StrackTrace:

 at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(Ssortingng methodName, Boolean async, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Ssortingng methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c) at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection) at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation) at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(Ssortingng migrationId, VersionedModel targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto) at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, Ssortingng targetMigrationId, Ssortingng lastMigrationId) at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(Ssortingng targetMigration) at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b() at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) at System.Data.Entity.Migrations.DbMigrator.Update(Ssortingng targetMigration) at System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func`3 createMigrator, ObjectContext objectContext) at System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext, DatabaseExistenceState existenceState) at System.Data.Entity.Database.Create(DatabaseExistenceState existenceState) at System.Data.Entity.CreateDatabaseIfNotExists`1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf`1.<CreateInitializationAction>b__e() at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c) at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() at System.Data.Entity.Internal.InternalContext.ExecuteSqlCommand(TransactionalBehavior transactionalBehavior, Ssortingng sql, Object[] parameters) at System.Data.Entity.Database.ExecuteSqlCommand(TransactionalBehavior transactionalBehavior, Ssortingng sql, Object[] parameters) at System.Data.Entity.Database.ExecuteSqlCommand(Ssortingng sql, Object[] parameters) 

En fonction de votre trace de stack, Entity Framework essaie d'exécuter des migrations avant d'exécuter votre command SQL. Comme votre string de connection pointe vers la database master (pas votre database user), les migrations essaient de créer des tables dans master que vous n'êtes pas autorisé à faire.

Si vous avez vraiment besoin de créer le nouveau login SQL à partir du code de votre application, une solution consisterait à faire pointer votre string de connection Entity Framework vers votre database user et créer une SqlConnection séparée avec la string de connection de votre base master pour faire l'étape CREATE LOGIN .