From 319af30665e9586e2782c6e5dc0aa8534e918eaa Mon Sep 17 00:00:00 2001 From: Aasim Khan Date: Thu, 6 Apr 2023 01:34:46 -0700 Subject: [PATCH] Fixing OE database expansion read only datamarts databases (#1991) --- .../ObjectExplorer/SmoModel/DatabaseTreeNode.cs | 13 +++++++++++-- .../ObjectExplorer/SqlServerType.cs | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/DatabaseTreeNode.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/DatabaseTreeNode.cs index 1321cd18..64f6ddce 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/DatabaseTreeNode.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/DatabaseTreeNode.cs @@ -79,8 +79,10 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel } catch (Exception ex) { - // IsAccessible is not set of DW Gen3 so exception is expected in this case - if (IsDWGen3(context?.Database)) + // IsAccessible is not set of DW Gen3 and Dataverse so exception is expected in this case + // Incase of dataverses and other TDS endpoints isAccessible creates a temp table to check if the database + // is accessible, however these endpoints may not support ddl statements and therefore the check fails. + if (IsDWGen3(context?.Database) || isUnknownDatabaseEdition(context?.Database)) { return true; } @@ -102,5 +104,12 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel && db.DatabaseEngineEdition == DatabaseEngineEdition.SqlDataWarehouse && db.ServerVersion.Major == 12; } + + private bool isUnknownDatabaseEdition(Database db) + { + // If the database engine edition is not defined in the enum, it is an unknown edition + return db != null + && !Enum.IsDefined(typeof(DatabaseEngineEdition), db.DatabaseEngineEdition); + } } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SqlServerType.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SqlServerType.cs index 19e2a363..62cff3aa 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SqlServerType.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SqlServerType.cs @@ -9,6 +9,7 @@ using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlTools.ServiceLayer.Connection.Contracts; +using Microsoft.SqlTools.Utility; namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer { @@ -41,7 +42,19 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer /// public static ValidForFlag GetValidForFlag(SqlServerType serverType, Database database = null) { - return GetValidForFlag(serverType, database != null && database.IsSqlDw); + var isSqlDw = false; + try + { + isSqlDw = database.IsSqlDw; + } + catch (Exception e) + { + // Incase of dataverses, isSqlDw creates a temp table to check if the database is accessible, however dataverse + // don't support ddl statements and therefore this check fails. + Logger.Information($"This exception is expected when we are trying to access a readonly database. Exception: {e.Message}"); + } + + return GetValidForFlag(serverType, database != null && isSqlDw); } /// @@ -95,7 +108,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer } else if (serverInfo.IsCloud) { - if (serverInfo.EngineEditionId == (int)DatabaseEngineEdition.SqlDataWarehouse + if (serverInfo.EngineEditionId == (int)DatabaseEngineEdition.SqlDataWarehouse && serverVersion.StartsWith("12", StringComparison.Ordinal)) { return SqlServerType.AzureSqlDWGen3;