From 0e7ed07a3074c91c0a1c16e28bf4ecdf69f240c4 Mon Sep 17 00:00:00 2001 From: Hai Cao Date: Thu, 11 May 2023 19:08:06 -0700 Subject: [PATCH] Fix schema handling in search result of User Management (#2057) * fix schema filed in search result * fix search for securable --- .../ObjectManagementService.cs | 3 +- .../ObjectManagement/SecurableUtils.cs | 49 +++++++++++++++++-- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectManagementService.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectManagementService.cs index cc954d49..8014a719 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectManagementService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectManagementService.cs @@ -173,7 +173,8 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement res.Add(new SearchResultItem { Name = obj.Name, - Type = type + Type = type, + Schema = obj.Schema }); } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/SecurableUtils.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/SecurableUtils.cs index 73dbb75d..5076f1d9 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/SecurableUtils.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/SecurableUtils.cs @@ -439,13 +439,52 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement } } - internal static SearchableObject ConvertFromSecurableNameToSearchableObject(string securableName, string type, string database, object connectionInfo) + internal static SearchableObject ConvertFromSecurableNameToSearchableObject(string securableName, string type, string database, string schema, object connectionInfo) { SearchableObjectType searchableObjectType = ConvertPotentialSqlObjectTypeToSearchableObjectType(type); SearchableObjectTypeDescription desc = SearchableObjectTypeDescription.GetDescription(searchableObjectType); - var urn = desc.GetSearchUrn(securableName, true, true); - return SearchableObject.GetSearchableObject(searchableObjectType, connectionInfo, database, securableName); + SearchableObjectCollection results = new SearchableObjectCollection(); + + if (desc.IsDatabaseObject) + { + if (desc.IsSchemaObject) + { + SearchableObject.Search( + results, + searchableObjectType, + connectionInfo, + database, + securableName, + true, + schema, + true, + true); + } + else + { + SearchableObject.Search( + results, + searchableObjectType, + connectionInfo, + database, + securableName, + true, + true); + } + } + else + { + SearchableObject.Search( + results, + searchableObjectType, + connectionInfo, + securableName, + true, + true); + } + SearchableObject result = (results.Count != 0) ? results[0] : null; + return result; } internal static void SendToServerPermissionChanges(bool exists, string name, SecurablePermissions[] securablePermissions, Principal principal, CDataContainer dataContainer, string database) @@ -464,7 +503,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement { foreach (SecurablePermissions secPerm in securablePermissions) { - var securable = principal.AddSecurable(SecurableUtils.ConvertFromSecurableNameToSearchableObject(secPerm.Name, secPerm.Type, database, dataContainer.ConnectionInfo)); + var securable = principal.AddSecurable(SecurableUtils.ConvertFromSecurableNameToSearchableObject(secPerm.Name, secPerm.Type, database, secPerm.Schema, dataContainer.ConnectionInfo)); var states = principal.GetPermissionStates(securable); ApplyPermissionStates(secPerm.Permissions, states); } @@ -474,7 +513,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement var securables = principal.GetSecurables(new SecurableComparer(SecurableComparer.DefaultSortingOrder, true)); foreach (SecurablePermissions secPerm in securablePermissions) { - var securable = FindMatchedSecurable(securables, secPerm.Name) ?? principal.AddSecurable(SecurableUtils.ConvertFromSecurableNameToSearchableObject(secPerm.Name, secPerm.Type, database, dataContainer.ConnectionInfo)); + var securable = FindMatchedSecurable(securables, secPerm.Name) ?? principal.AddSecurable(SecurableUtils.ConvertFromSecurableNameToSearchableObject(secPerm.Name, secPerm.Type, database, secPerm.Schema, dataContainer.ConnectionInfo)); var states = principal.GetPermissionStates(securable); ApplyPermissionStates(secPerm.Permissions, states); }