diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectTypes/User/UserHandler.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectTypes/User/UserHandler.cs index 81a5544f..f22854f3 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectTypes/User/UserHandler.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectTypes/User/UserHandler.cs @@ -201,6 +201,16 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement } } + string[] dbRolesInDb; + if (isSqlAzure && string.Compare(parameters.Database, "master", true) == 0) + { + dbRolesInDb = currentUserPrototype.DatabaseRoleNames.Where(SecurableUtils.SpecialDbRolesInSqlDbMaster.Contains).ToArray(); + } + else + { + dbRolesInDb = currentUserPrototype.DatabaseRoleNames.ToArray(); + } + UserViewInfo userViewInfo = new UserViewInfo() { ObjectInfo = new UserInfo() @@ -219,7 +229,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement Languages = languageOptionsList.ToArray(), Schemas = currentUserPrototype.SchemaNames.ToArray(), Logins = logins, - DatabaseRoles = currentUserPrototype.DatabaseRoleNames.ToArray(), + DatabaseRoles = dbRolesInDb, SupportedSecurableTypes = SecurableUtils.GetSecurableTypeMetadata(SqlObjectType.User, dataContainer.Server.Version, parameters.Database, dataContainer.Server.DatabaseEngineType, dataContainer.Server.DatabaseEngineEdition) }; var context = new UserViewContext(parameters, dataContainer.ServerConnection, currentUserPrototype.CurrentState); diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/SecurableUtils.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/SecurableUtils.cs index ebbeb367..a79520a9 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/SecurableUtils.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/SecurableUtils.cs @@ -70,6 +70,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement "; + // This is a set of special database roles exist only in the virtual master database of SQL DB. + // https://learn.microsoft.com/en-us/sql/relational-databases/security/authentication-access/database-level-roles?view=azuresqldb-current + public static HashSet SpecialDbRolesInSqlDbMaster = new HashSet(){"dbmanager", "loginmanager"}; + public static SecurableTypeMetadata[] GetSecurableTypeMetadata(SqlObjectType objectType, Version serverVersion, string databaseName,DatabaseEngineType databaseEngineType, DatabaseEngineEdition engineEdition) { List res = new List();