Query logins on system database for Azure connections (#2038)

* Query logins on system database for Azure connections

* Fix name of connection variable
This commit is contained in:
Karl Burtram
2023-05-02 12:46:18 -07:00
committed by GitHub
parent 8d48ff735b
commit 5954bdc65c

View File

@@ -177,6 +177,30 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
} }
supportedUserTypes.Add(DatabaseUserType.NoLoginAccess); supportedUserTypes.Add(DatabaseUserType.NoLoginAccess);
string[] logins = DatabaseUtils.LoadSqlLogins(dataContainer.ServerConnection);
// If we couldn't load logins on current connection and this is a SQL DB connection
// not to master then try to connect to master. The "sys.sql_logins" DMV is not visible to user databases.
if (logins.Length == 0 && isSqlAzure
&& string.Compare(parameters.Database, "master", true) != 0)
{
ServerConnection masterServerConnection = null;
try
{
originalConnInfo.ConnectionDetails.DatabaseName = "master";
masterServerConnection = ConnectionService.OpenServerConnection(originalConnInfo, "MasterDataContainer");
logins = DatabaseUtils.LoadSqlLogins(masterServerConnection);
}
finally
{
originalConnInfo.ConnectionDetails.DatabaseName = originalDatabaseName;
if (masterServerConnection != null)
{
masterServerConnection.Disconnect();
}
}
}
UserViewInfo userViewInfo = new UserViewInfo() UserViewInfo userViewInfo = new UserViewInfo()
{ {
ObjectInfo = new UserInfo() ObjectInfo = new UserInfo()
@@ -193,7 +217,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement
UserTypes = supportedUserTypes.ToArray(), UserTypes = supportedUserTypes.ToArray(),
Languages = languageOptionsList.ToArray(), Languages = languageOptionsList.ToArray(),
Schemas = currentUserPrototype.SchemaNames.ToArray(), Schemas = currentUserPrototype.SchemaNames.ToArray(),
Logins = DatabaseUtils.LoadSqlLogins(dataContainer.ServerConnection), Logins = logins,
DatabaseRoles = currentUserPrototype.DatabaseRoleNames.ToArray() DatabaseRoles = currentUserPrototype.DatabaseRoleNames.ToArray()
}; };
var context = new UserViewContext(parameters, dataContainer.ServerConnection, currentUserPrototype.CurrentState); var context = new UserViewContext(parameters, dataContainer.ServerConnection, currentUserPrototype.CurrentState);