diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/DatabaseTreeNode.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/DatabaseTreeNode.cs index 1fccba1a..60530729 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/DatabaseTreeNode.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SmoModel/DatabaseTreeNode.cs @@ -8,6 +8,7 @@ using System; using System.Diagnostics; using System.Globalization; using System.Threading; +using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlTools.Utility; @@ -25,7 +26,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel // the user connected directly to the master of a readable secondary // In that case, the name in the connection string won't be found in sys.databases // We detect that here and fall back to master - if (db.State == SqlSmoState.Creating) + if (db.State == SqlSmoState.Creating && !IsDWGen3(db)) { db = new Database(serverNode.GetContextAs().Server, "master"); db.Refresh(); @@ -75,12 +76,28 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel } catch (Exception ex) { - var error = string.Format(CultureInfo.InvariantCulture, "Failed to get IsAccessible. error:{0} inner:{1} stacktrace:{2}", - ex.Message, ex.InnerException != null ? ex.InnerException.Message : "", ex.StackTrace); - Logger.Write(TraceEventType.Error, error); - ErrorMessage = ex.Message; - return false; + // IsAccessible is not set of DW Gen3 so exception is expected in this case + if (IsDWGen3(context?.Database)) + { + return true; + } + else + { + var error = string.Format(CultureInfo.InvariantCulture, "Failed to get IsAccessible. error:{0} inner:{1} stacktrace:{2}", + ex.Message, ex.InnerException != null ? ex.InnerException.Message : "", ex.StackTrace); + Logger.Write(TraceEventType.Error, error); + ErrorMessage = ex.Message; + return false; + } + } } + + private bool IsDWGen3(Database db) + { + return db != null + && db.DatabaseEngineEdition == DatabaseEngineEdition.SqlDataWarehouse + && db.ServerVersion.Major == 12; + } } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SqlServerType.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SqlServerType.cs index 0b1de37f..0301c9f4 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SqlServerType.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/SqlServerType.cs @@ -4,6 +4,7 @@ // using System; +using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlTools.ServiceLayer.Connection.Contracts; @@ -22,7 +23,8 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer Sql2016, Sql2017, AzureV12, - SqlOnDemand + SqlOnDemand, + AzureSqlDWGen3 } /// @@ -59,7 +61,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer ValidForFlag validforFlag = ValidForFlag.All; if (Enum.TryParse(serverType.ToString(), out validforFlag)) { - if (isSqlDw && serverType == SqlServerType.AzureV12) + if ((isSqlDw && serverType == SqlServerType.AzureV12) || serverType == SqlServerType.AzureSqlDWGen3) { validforFlag = ValidForFlag.SqlDw; } @@ -90,7 +92,15 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer } else if (serverInfo.IsCloud) { - serverType = SqlServerType.AzureV12; + if (serverInfo.EngineEditionId == (int)DatabaseEngineEdition.SqlDataWarehouse + && serverVersion.StartsWith("12", StringComparison.Ordinal)) + { + serverType = SqlServerType.AzureSqlDWGen3; + } + else + { + serverType = SqlServerType.AzureV12; + } } else if (!string.IsNullOrWhiteSpace(serverVersion)) { diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ValidForFlag.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ValidForFlag.cs index ed146932..5b12500e 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ValidForFlag.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ValidForFlag.cs @@ -21,6 +21,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer Sql2017 = 0x40, SqlDw = 0x80, SqlOnDemand = 0x100, + AzureSqlDWGen3 = 0x200, AllOnPrem = Sql2005 | Sql2008 | Sql2012 | Sql2014 | Sql2016 | Sql2017, AllAzure = AzureV12, All = Sql2005 | Sql2008 | Sql2012 | Sql2014 | Sql2016 | Sql2017 | AzureV12 | SqlDw | SqlOnDemand,