mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-16 18:47:57 -05:00
Ledger Objects Representation in Object Explorer (#1615)
* support for ledger objects in OE * generated sr files * update versionKey to sql 2022 in test env config * more 2019 to 2022 updates * add sql2022 instead of replacing * missed filter on table * add logging * more logging * adding Script160Compat options for sql2022 Co-authored-by: Alan Ren <alanren@microsoft.com>
This commit is contained in:
@@ -11,13 +11,13 @@ steps:
|
|||||||
dockerVersion: 17.09.0-ce
|
dockerVersion: 17.09.0-ce
|
||||||
releaseType: stable
|
releaseType: stable
|
||||||
|
|
||||||
- script: docker pull mcr.microsoft.com/mssql/server:2019-latest
|
- script: docker pull mcr.microsoft.com/mssql/server:2022-latest
|
||||||
displayName: Pull MSSQL Docker Image
|
displayName: Pull MSSQL Docker Image
|
||||||
|
|
||||||
- bash: echo "##vso[task.setvariable variable=defaultSql2019_password;issecret=true]Test-$(Build.BuildNumber)-$(Get-Date -format yyyyMMdd-Hmmss)"
|
- bash: echo "##vso[task.setvariable variable=defaultSql2022_password;issecret=true]Test-$(Build.BuildNumber)-$(Get-Date -format yyyyMMdd-Hmmss)"
|
||||||
displayName: Generate password for test server
|
displayName: Generate password for test server
|
||||||
|
|
||||||
- script: 'docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=$(defaultSql2019_password)" -e "MSSQL_AGENT_ENABLED=True" -p 1433:1433 --name sql1 -h sql1 -d mcr.microsoft.com/mssql/server:2019-latest'
|
- script: 'docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=$(defaultSql2022_password)" -e "MSSQL_AGENT_ENABLED=True" -p 1433:1433 --name sql1 -h sql1 -d mcr.microsoft.com/mssql/server:2022-latest'
|
||||||
displayName: Starting Server in Docker Container
|
displayName: Starting Server in Docker Container
|
||||||
|
|
||||||
- task: UseDotNet@2
|
- task: UseDotNet@2
|
||||||
@@ -51,7 +51,7 @@ steps:
|
|||||||
arguments: $(testEnvironmentPath.secureFilePath)
|
arguments: $(testEnvironmentPath.secureFilePath)
|
||||||
testRunTitle: 'Setting tests'
|
testRunTitle: 'Setting tests'
|
||||||
env:
|
env:
|
||||||
defaultSql2019_password: '$(defaultSql2019_password)'
|
defaultSql2022_password: '$(defaultSql2022_password)'
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
displayName: 'Azure Key Vault: SqlToolsSecretStore'
|
displayName: 'Azure Key Vault: SqlToolsSecretStore'
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ namespace Microsoft.Kusto.ServiceLayer.Scripting.Contracts
|
|||||||
/// Script130Compat
|
/// Script130Compat
|
||||||
/// Script140Compat
|
/// Script140Compat
|
||||||
/// Script150Compat
|
/// Script150Compat
|
||||||
|
/// Script160Compat
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// The default is Script140Compat.
|
/// The default is Script140Compat.
|
||||||
|
|||||||
@@ -297,6 +297,8 @@ namespace Microsoft.Kusto.ServiceLayer.Scripting
|
|||||||
/// Script120Compat
|
/// Script120Compat
|
||||||
/// Script130Compat
|
/// Script130Compat
|
||||||
/// Script140Compat
|
/// Script140Compat
|
||||||
|
/// Script150Compat
|
||||||
|
/// Script160Compat
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// The default is Script140Compat.
|
/// The default is Script140Compat.
|
||||||
|
|||||||
@@ -193,6 +193,7 @@ namespace Microsoft.Kusto.ServiceLayer.Scripting
|
|||||||
{
|
{
|
||||||
return new Dictionary<string, SqlServerVersion>
|
return new Dictionary<string, SqlServerVersion>
|
||||||
{
|
{
|
||||||
|
{SqlScriptOptions.ScriptCompatibilityOptions.Script160Compat.ToString(), SqlServerVersion.Version160},
|
||||||
{SqlScriptOptions.ScriptCompatibilityOptions.Script150Compat.ToString(), SqlServerVersion.Version150},
|
{SqlScriptOptions.ScriptCompatibilityOptions.Script150Compat.ToString(), SqlServerVersion.Version150},
|
||||||
{SqlScriptOptions.ScriptCompatibilityOptions.Script140Compat.ToString(), SqlServerVersion.Version140},
|
{SqlScriptOptions.ScriptCompatibilityOptions.Script140Compat.ToString(), SqlServerVersion.Version140},
|
||||||
{SqlScriptOptions.ScriptCompatibilityOptions.Script130Compat.ToString(), SqlServerVersion.Version130},
|
{SqlScriptOptions.ScriptCompatibilityOptions.Script130Compat.ToString(), SqlServerVersion.Version130},
|
||||||
|
|||||||
@@ -2245,6 +2245,30 @@ namespace Microsoft.SqlTools.ServiceLayer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string UpdatableLedger_LabelPart
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Keys.GetString(Keys.UpdatableLedger_LabelPart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string AppendOnlyLedger_LabelPart
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Keys.GetString(Keys.AppendOnlyLedger_LabelPart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string Ledger_LabelPart
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Keys.GetString(Keys.Ledger_LabelPart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static string External_LabelPart
|
public static string External_LabelPart
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -10622,6 +10646,15 @@ namespace Microsoft.SqlTools.ServiceLayer
|
|||||||
public const string SystemVersioned_LabelPart = "SystemVersioned_LabelPart";
|
public const string SystemVersioned_LabelPart = "SystemVersioned_LabelPart";
|
||||||
|
|
||||||
|
|
||||||
|
public const string UpdatableLedger_LabelPart = "UpdatableLedger_LabelPart";
|
||||||
|
|
||||||
|
|
||||||
|
public const string AppendOnlyLedger_LabelPart = "AppendOnlyLedger_LabelPart";
|
||||||
|
|
||||||
|
|
||||||
|
public const string Ledger_LabelPart = "Ledger_LabelPart";
|
||||||
|
|
||||||
|
|
||||||
public const string External_LabelPart = "External_LabelPart";
|
public const string External_LabelPart = "External_LabelPart";
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1380,6 +1380,18 @@
|
|||||||
<value>System-Versioned</value>
|
<value>System-Versioned</value>
|
||||||
<comment></comment>
|
<comment></comment>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="UpdatableLedger_LabelPart" xml:space="preserve">
|
||||||
|
<value>Updatable Ledger</value>
|
||||||
|
<comment></comment>
|
||||||
|
</data>
|
||||||
|
<data name="AppendOnlyLedger_LabelPart" xml:space="preserve">
|
||||||
|
<value>Append-Only Ledger</value>
|
||||||
|
<comment></comment>
|
||||||
|
</data>
|
||||||
|
<data name="Ledger_LabelPart" xml:space="preserve">
|
||||||
|
<value>Ledger</value>
|
||||||
|
<comment></comment>
|
||||||
|
</data>
|
||||||
<data name="External_LabelPart" xml:space="preserve">
|
<data name="External_LabelPart" xml:space="preserve">
|
||||||
<value>External</value>
|
<value>External</value>
|
||||||
<comment></comment>
|
<comment></comment>
|
||||||
|
|||||||
@@ -680,6 +680,12 @@ History_LabelPart = History
|
|||||||
|
|
||||||
SystemVersioned_LabelPart = System-Versioned
|
SystemVersioned_LabelPart = System-Versioned
|
||||||
|
|
||||||
|
UpdatableLedger_LabelPart = Updatable Ledger
|
||||||
|
|
||||||
|
AppendOnlyLedger_LabelPart = Append-Only Ledger
|
||||||
|
|
||||||
|
Ledger_LabelPart = Ledger
|
||||||
|
|
||||||
External_LabelPart = External
|
External_LabelPart = External
|
||||||
|
|
||||||
FileTable_LabelPart = File Table
|
FileTable_LabelPart = File Table
|
||||||
|
|||||||
@@ -6254,6 +6254,21 @@ The Query Processor estimates that implementing the following index could improv
|
|||||||
<target state="new">Average Row Size</target>
|
<target state="new">Average Row Size</target>
|
||||||
<note></note>
|
<note></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="UpdatableLedger_LabelPart">
|
||||||
|
<source>Updatable Ledger</source>
|
||||||
|
<target state="new">Updatable Ledger</target>
|
||||||
|
<note></note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="AppendOnlyLedger_LabelPart">
|
||||||
|
<source>Append-Only Ledger</source>
|
||||||
|
<target state="new">Append-Only Ledger</target>
|
||||||
|
<note></note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Ledger_LabelPart">
|
||||||
|
<source>Ledger</source>
|
||||||
|
<target state="new">Ledger</target>
|
||||||
|
<note></note>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
@@ -17,27 +17,27 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Property name
|
/// Property name
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Property { get; set; }
|
public string Property { get; set; } = string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Filter values
|
/// Filter values
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<object> Values { get; set; }
|
public List<object> Values { get; set; } = default!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Type of the filter values
|
/// Type of the filter values
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Type Type { get; set; }
|
public Type Type { get; set; } = default!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates which platforms a filter is valid for
|
/// Indicates which platforms a filter is valid for
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ValidForFlag ValidFor { get; set; }
|
public ValidForFlag ValidFor { get; set; } = ValidForFlag.None;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The type of the Querier the filter can be applied to
|
/// The type of the Querier the filter can be applied to
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Type TypeToReverse { get; set; }
|
public Type TypeToReverse { get; set; } = default!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns true if the filter can be apply to the given type and Server type
|
/// Returns true if the filter can be apply to the given type and Server type
|
||||||
|
|||||||
@@ -29,6 +29,24 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
child.IsAlwaysLeaf = true;
|
child.IsAlwaysLeaf = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override string GetNodeSubType(object smoObject, SmoQueryContext smoContext)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Database? db = smoObject as Database;
|
||||||
|
if (db != null && IsPropertySupported("IsLedger", smoContext, db, CachedSmoProperties) && db.IsLedger)
|
||||||
|
{
|
||||||
|
return "Ledger";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
//Ignore the exception and just not change create custom name
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static class DatabasesCustomNodeHelper
|
internal static class DatabasesCustomNodeHelper
|
||||||
@@ -38,7 +56,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
|
|
||||||
internal static bool GetDatabaseIsUnavailable(object smoObject, SmoQueryContext smoContext, IEnumerable<NodeSmoProperty> supportedProperties)
|
internal static bool GetDatabaseIsUnavailable(object smoObject, SmoQueryContext smoContext, IEnumerable<NodeSmoProperty> supportedProperties)
|
||||||
{
|
{
|
||||||
Database db = smoObject as Database;
|
Database? db = smoObject as Database;
|
||||||
if (db != null && SmoChildFactoryBase.IsPropertySupported("Status", smoContext, db, supportedProperties))
|
if (db != null && SmoChildFactoryBase.IsPropertySupported("Status", smoContext, db, supportedProperties))
|
||||||
{
|
{
|
||||||
DatabaseStatus status;
|
DatabaseStatus status;
|
||||||
@@ -66,7 +84,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
|
|
||||||
internal static string GetStatus(object smoObject, SmoQueryContext smoContext, IEnumerable<NodeSmoProperty> supportedProperties)
|
internal static string GetStatus(object smoObject, SmoQueryContext smoContext, IEnumerable<NodeSmoProperty> supportedProperties)
|
||||||
{
|
{
|
||||||
Database db = smoObject as Database;
|
Database? db = smoObject as Database;
|
||||||
if (db != null && SmoChildFactoryBase.IsPropertySupported("Status", smoContext, db, supportedProperties))
|
if (db != null && SmoChildFactoryBase.IsPropertySupported("Status", smoContext, db, supportedProperties))
|
||||||
{
|
{
|
||||||
DatabaseStatus status;
|
DatabaseStatus status;
|
||||||
|
|||||||
@@ -16,7 +16,18 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Table table = smoObject as Table;
|
Table? table = smoObject as Table;
|
||||||
|
if (table != null && IsPropertySupported("LedgerType", smoContext, table, CachedSmoProperties))
|
||||||
|
{
|
||||||
|
if (table.LedgerType == LedgerTableType.AppendOnlyLedgerTable)
|
||||||
|
{
|
||||||
|
return $"{table.Schema}.{table.Name} ({SR.AppendOnlyLedger_LabelPart})";
|
||||||
|
}
|
||||||
|
else if (table.LedgerType == LedgerTableType.UpdatableLedgerTable)
|
||||||
|
{
|
||||||
|
return $"{table.Schema}.{table.Name} ({SR.UpdatableLedger_LabelPart})";
|
||||||
|
}
|
||||||
|
}
|
||||||
if (table != null && IsPropertySupported("IsSystemVersioned", smoContext, table, CachedSmoProperties) && table.IsSystemVersioned)
|
if (table != null && IsPropertySupported("IsSystemVersioned", smoContext, table, CachedSmoProperties) && table.IsSystemVersioned)
|
||||||
{
|
{
|
||||||
return $"{table.Schema}.{table.Name} ({SR.SystemVersioned_LabelPart})";
|
return $"{table.Schema}.{table.Name} ({SR.SystemVersioned_LabelPart})";
|
||||||
@@ -42,7 +53,12 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Table table = smoObject as Table;
|
Table? table = smoObject as Table;
|
||||||
|
if (table != null && IsPropertySupported("LedgerType", smoContext, table, CachedSmoProperties) &&
|
||||||
|
(table.LedgerType == LedgerTableType.AppendOnlyLedgerTable || table.LedgerType == LedgerTableType.UpdatableLedgerTable))
|
||||||
|
{
|
||||||
|
return "Ledger";
|
||||||
|
}
|
||||||
if (table != null && IsPropertySupported("TemporalType", smoContext, table, CachedSmoProperties) && table.TemporalType != TableTemporalType.None)
|
if (table != null && IsPropertySupported("TemporalType", smoContext, table, CachedSmoProperties) && table.TemporalType != TableTemporalType.None)
|
||||||
{
|
{
|
||||||
return "Temporal";
|
return "Temporal";
|
||||||
@@ -70,13 +86,13 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Custom name for history table
|
/// Custom name and icon for history table
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal partial class TableChildFactory : SmoChildFactoryBase
|
internal partial class TableChildFactory : SmoChildFactoryBase
|
||||||
{
|
{
|
||||||
public override string GetNodeCustomName(object smoObject, SmoQueryContext smoContext)
|
public override string GetNodeCustomName(object smoObject, SmoQueryContext smoContext)
|
||||||
{
|
{
|
||||||
Table table = smoObject as Table;
|
Table? table = smoObject as Table;
|
||||||
if (table != null)
|
if (table != null)
|
||||||
{
|
{
|
||||||
return $"{table.Schema}.{table.Name} ({SR.History_LabelPart})";
|
return $"{table.Schema}.{table.Name} ({SR.History_LabelPart})";
|
||||||
@@ -85,6 +101,22 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override string GetNodeSubType(object smoObject, SmoQueryContext smoContext)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Table? table = smoObject as Table;
|
||||||
|
if (table != null && IsPropertySupported("LedgerType", smoContext, table, CachedSmoProperties) &&
|
||||||
|
table.LedgerType == LedgerTableType.HistoryTable)
|
||||||
|
{
|
||||||
|
return "LedgerHistory";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {}
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
public override string GetNodePathName(object smoObject)
|
public override string GetNodePathName(object smoObject)
|
||||||
{
|
{
|
||||||
return TableCustomNodeHelper.GetPathName(smoObject);
|
return TableCustomNodeHelper.GetPathName(smoObject);
|
||||||
@@ -95,7 +127,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
{
|
{
|
||||||
internal static string GetPathName(object smoObject)
|
internal static string GetPathName(object smoObject)
|
||||||
{
|
{
|
||||||
Table table = smoObject as Table;
|
Table? table = smoObject as Table;
|
||||||
if (table != null)
|
if (table != null)
|
||||||
{
|
{
|
||||||
return $"{table.Schema}.{table.Name}";
|
return $"{table.Schema}.{table.Name}";
|
||||||
|
|||||||
@@ -785,6 +785,18 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
{ TableTemporalType.SystemVersioned }
|
{ TableTemporalType.SystemVersioned }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
filters.Add(new NodePropertyFilter
|
||||||
|
{
|
||||||
|
Property = "LedgerType",
|
||||||
|
Type = typeof(Enum),
|
||||||
|
ValidFor = ValidForFlag.Sql2022|ValidForFlag.AzureV12,
|
||||||
|
Values = new List<object>
|
||||||
|
{
|
||||||
|
{ LedgerTableType.None },
|
||||||
|
{ LedgerTableType.AppendOnlyLedgerTable },
|
||||||
|
{ LedgerTableType.UpdatableLedgerTable }
|
||||||
|
}
|
||||||
|
});
|
||||||
return filters;
|
return filters;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -810,6 +822,11 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12
|
ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12
|
||||||
});
|
});
|
||||||
properties.Add(new NodeSmoProperty
|
properties.Add(new NodeSmoProperty
|
||||||
|
{
|
||||||
|
Name = "LedgerType",
|
||||||
|
ValidFor = ValidForFlag.Sql2022|ValidForFlag.AzureV12
|
||||||
|
});
|
||||||
|
properties.Add(new NodeSmoProperty
|
||||||
{
|
{
|
||||||
Name = "IsExternal",
|
Name = "IsExternal",
|
||||||
ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12|ValidForFlag.SqlOnDemand
|
ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12|ValidForFlag.SqlOnDemand
|
||||||
@@ -1312,21 +1329,56 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
get
|
get
|
||||||
{
|
{
|
||||||
var filters = new List<INodeFilter>();
|
var filters = new List<INodeFilter>();
|
||||||
filters.Add(new NodePropertyFilter
|
filters.Add(new NodeOrFilter
|
||||||
{
|
{
|
||||||
Property = "TemporalType",
|
FilterList = new List<NodePropertyFilter> {
|
||||||
Type = typeof(Enum),
|
new NodePropertyFilter
|
||||||
TypeToReverse = typeof(SqlHistoryTableQuerier),
|
{
|
||||||
ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12,
|
Property = "TemporalType",
|
||||||
Values = new List<object>
|
Type = typeof(Enum),
|
||||||
{
|
TypeToReverse = typeof(SqlHistoryTableQuerier),
|
||||||
{ TableTemporalType.HistoryTable }
|
ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12,
|
||||||
|
Values = new List<object>
|
||||||
|
{
|
||||||
|
{ TableTemporalType.HistoryTable }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new NodePropertyFilter
|
||||||
|
{
|
||||||
|
Property = "LedgerType",
|
||||||
|
Type = typeof(Enum),
|
||||||
|
TypeToReverse = typeof(SqlHistoryTableQuerier),
|
||||||
|
ValidFor = ValidForFlag.Sql2022|ValidForFlag.AzureV12,
|
||||||
|
Values = new List<object>
|
||||||
|
{
|
||||||
|
{ LedgerTableType.HistoryTable }
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return filters;
|
return filters;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override IEnumerable<NodeSmoProperty> SmoProperties
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var properties = new List<NodeSmoProperty>();
|
||||||
|
properties.Add(new NodeSmoProperty
|
||||||
|
{
|
||||||
|
Name = "LedgerType",
|
||||||
|
ValidFor = ValidForFlag.Sql2022|ValidForFlag.AzureV12
|
||||||
|
});
|
||||||
|
properties.Add(new NodeSmoProperty
|
||||||
|
{
|
||||||
|
Name = "TemporalType",
|
||||||
|
ValidFor = ValidForFlag.Sql2016|ValidForFlag.Sql2017|ValidForFlag.Sql2019|ValidForFlag.Sql2022|ValidForFlag.AzureV12
|
||||||
|
});
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected override void OnExpandPopulateFolders(IList<TreeNode> currentChildren, TreeNode parent)
|
protected override void OnExpandPopulateFolders(IList<TreeNode> currentChildren, TreeNode parent)
|
||||||
{
|
{
|
||||||
currentChildren.Add(new FolderNode {
|
currentChildren.Add(new FolderNode {
|
||||||
|
|||||||
@@ -71,17 +71,23 @@
|
|||||||
</Node>
|
</Node>
|
||||||
|
|
||||||
<Node Name="Tables" LocLabel="SR.SchemaHierarchy_Tables" BaseClass="ModelBased" Strategy="MultipleElementsOfType" ChildQuerierTypes="SqlTable" TreeNode="TableTreeNode">
|
<Node Name="Tables" LocLabel="SR.SchemaHierarchy_Tables" BaseClass="ModelBased" Strategy="MultipleElementsOfType" ChildQuerierTypes="SqlTable" TreeNode="TableTreeNode">
|
||||||
<Filters >
|
<Filters>
|
||||||
<Filter Property="IsSystemObject" Value="0" Type="bool" />
|
<Filter Property="IsSystemObject" Value="0" Type="bool" />
|
||||||
<Filter Property="TemporalType" Type="Enum" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12">
|
<Filter Property="TemporalType" Type="Enum" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12">
|
||||||
<Value>TableTemporalType.None</Value>
|
<Value>TableTemporalType.None</Value>
|
||||||
<Value>TableTemporalType.SystemVersioned</Value>
|
<Value>TableTemporalType.SystemVersioned</Value>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Property="LedgerType" Type="Enum" ValidFor="Sql2022|AzureV12">
|
||||||
|
<Value>LedgerTableType.None</Value>
|
||||||
|
<Value>LedgerTableType.AppendOnlyLedgerTable</Value>
|
||||||
|
<Value>LedgerTableType.UpdatableLedgerTable</Value>
|
||||||
|
</Filter>
|
||||||
</Filters>
|
</Filters>
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property Name="IsFileTable" ValidFor="Sql2012|Sql2014|Sql2016|Sql2017|Sql2019|Sql2022"/>
|
<Property Name="IsFileTable" ValidFor="Sql2012|Sql2014|Sql2016|Sql2017|Sql2019|Sql2022"/>
|
||||||
<Property Name="IsSystemVersioned" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12"/>
|
<Property Name="IsSystemVersioned" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12"/>
|
||||||
<Property Name="TemporalType" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12"/>
|
<Property Name="TemporalType" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12"/>
|
||||||
|
<Property Name="LedgerType" ValidFor="Sql2022|AzureV12"/>
|
||||||
<Property Name="IsExternal" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12|SqlOnDemand"/>
|
<Property Name="IsExternal" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12|SqlOnDemand"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Child Name="SystemTables" IsSystemObject="1"/>
|
<Child Name="SystemTables" IsSystemObject="1"/>
|
||||||
@@ -169,10 +175,19 @@
|
|||||||
-->
|
-->
|
||||||
<Node Name="Table" LocLabel="string.Empty" BaseClass="ModelBased" IsAsyncLoad="" Strategy="MultipleElementsOfType" ChildQuerierTypes="SqlTable;SqlHistoryTable" TreeNode="HistoryTableTreeNode">
|
<Node Name="Table" LocLabel="string.Empty" BaseClass="ModelBased" IsAsyncLoad="" Strategy="MultipleElementsOfType" ChildQuerierTypes="SqlTable;SqlHistoryTable" TreeNode="HistoryTableTreeNode">
|
||||||
<Filters>
|
<Filters>
|
||||||
<Filter TypeToReverse="SqlHistoryTable" Property="TemporalType" Type="Enum" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12">
|
<Or>
|
||||||
<Value>TableTemporalType.HistoryTable</Value>
|
<Filter TypeToReverse="SqlHistoryTable" Property="TemporalType" Type="Enum" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12">
|
||||||
</Filter>
|
<Value>TableTemporalType.HistoryTable</Value>
|
||||||
|
</Filter>
|
||||||
|
<Filter TypeToReverse="SqlHistoryTable" Property="LedgerType" Type="Enum" ValidFor="Sql2022|AzureV12">
|
||||||
|
<Value>LedgerTableType.HistoryTable</Value>
|
||||||
|
</Filter>
|
||||||
|
</Or>
|
||||||
</Filters>
|
</Filters>
|
||||||
|
<Properties>
|
||||||
|
<Property Name="LedgerType" ValidFor="Sql2022|AzureV12"/>
|
||||||
|
<Property Name="TemporalType" ValidFor="Sql2016|Sql2017|Sql2019|Sql2022|AzureV12"/>
|
||||||
|
</Properties>
|
||||||
<Child Name="Columns"/>
|
<Child Name="Columns"/>
|
||||||
<Child Name="Keys"/>
|
<Child Name="Keys"/>
|
||||||
<Child Name="Constraints"/>
|
<Child Name="Constraints"/>
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) Microsoft. All rights reserved.
|
||||||
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||||
|
//
|
||||||
|
|
||||||
|
using Microsoft.SqlServer.Management.Smo;
|
||||||
|
|
||||||
|
namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom name for view
|
||||||
|
/// </summary>
|
||||||
|
internal partial class ViewsChildFactory : SmoChildFactoryBase
|
||||||
|
{
|
||||||
|
public override string GetNodeCustomName(object smoObject, SmoQueryContext smoContext)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
View? view = smoObject as View;
|
||||||
|
if (view != null &&
|
||||||
|
IsPropertySupported("LedgerViewType", smoContext, view, CachedSmoProperties) &&
|
||||||
|
view.LedgerViewType == LedgerViewType.LedgerView)
|
||||||
|
{
|
||||||
|
return $"{view.Schema}.{view.Name} ({SR.Ledger_LabelPart})";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {} //Ignore the exception and just not change create custom name
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetNodeSubType(object smoObject, SmoQueryContext smoContext)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
View? view = smoObject as View;
|
||||||
|
if (view != null && IsPropertySupported("LedgerViewType", smoContext, view, CachedSmoProperties) &&
|
||||||
|
view.LedgerViewType == LedgerViewType.LedgerView)
|
||||||
|
{
|
||||||
|
return "Ledger";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {} //Ignore the exception and just not change create custom name
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetNodePathName(object smoObject)
|
||||||
|
{
|
||||||
|
return ViewCustomNodeHelper.GetPathName(smoObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static class ViewCustomNodeHelper
|
||||||
|
{
|
||||||
|
internal static string GetPathName(object smoObject)
|
||||||
|
{
|
||||||
|
View? view = smoObject as View;
|
||||||
|
if (view != null)
|
||||||
|
{
|
||||||
|
return $"{view.Schema}.{view.Name}";
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -125,6 +125,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Scripting.Contracts
|
|||||||
/// Script130Compat
|
/// Script130Compat
|
||||||
/// Script140Compat
|
/// Script140Compat
|
||||||
/// Script150Compat
|
/// Script150Compat
|
||||||
|
/// Script160Compat
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// The default is Script140Compat.
|
/// The default is Script140Compat.
|
||||||
|
|||||||
@@ -297,6 +297,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Scripting
|
|||||||
/// Script120Compat
|
/// Script120Compat
|
||||||
/// Script130Compat
|
/// Script130Compat
|
||||||
/// Script140Compat
|
/// Script140Compat
|
||||||
|
/// Script150Compat
|
||||||
|
/// Script160Compat
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// The default is Script140Compat.
|
/// The default is Script140Compat.
|
||||||
|
|||||||
@@ -552,6 +552,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Scripting
|
|||||||
{
|
{
|
||||||
return new Dictionary<string, SqlServerVersion>
|
return new Dictionary<string, SqlServerVersion>
|
||||||
{
|
{
|
||||||
|
{SqlScriptOptions.ScriptCompatibilityOptions.Script160Compat.ToString(), SqlServerVersion.Version160},
|
||||||
{SqlScriptOptions.ScriptCompatibilityOptions.Script150Compat.ToString(), SqlServerVersion.Version150},
|
{SqlScriptOptions.ScriptCompatibilityOptions.Script150Compat.ToString(), SqlServerVersion.Version150},
|
||||||
{SqlScriptOptions.ScriptCompatibilityOptions.Script140Compat.ToString(), SqlServerVersion.Version140},
|
{SqlScriptOptions.ScriptCompatibilityOptions.Script140Compat.ToString(), SqlServerVersion.Version140},
|
||||||
{SqlScriptOptions.ScriptCompatibilityOptions.Script130Compat.ToString(), SqlServerVersion.Version130},
|
{SqlScriptOptions.ScriptCompatibilityOptions.Script130Compat.ToString(), SqlServerVersion.Version130},
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Scripting
|
|||||||
serverVersionMap.Add(13, "Script140Compat");
|
serverVersionMap.Add(13, "Script140Compat");
|
||||||
serverVersionMap.Add(14, "Script140Compat");
|
serverVersionMap.Add(14, "Script140Compat");
|
||||||
serverVersionMap.Add(15, "Script140Compat");
|
serverVersionMap.Add(15, "Script140Compat");
|
||||||
|
serverVersionMap.Add(16, "Script160Compat");
|
||||||
|
|
||||||
// Mapping the object types for scripting
|
// Mapping the object types for scripting
|
||||||
objectScriptMap.Add("table", "Table");
|
objectScriptMap.Add("table", "Table");
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using System.Collections.Generic;
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -471,7 +472,28 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectExplorer
|
|||||||
if (!string.IsNullOrEmpty(baseline))
|
if (!string.IsNullOrEmpty(baseline))
|
||||||
{
|
{
|
||||||
string actual = stringBuilder.ToString();
|
string actual = stringBuilder.ToString();
|
||||||
Assert.That(actual, Is.EqualTo(baseline), $"Baseline comparison for {baselineFileName} failed");
|
|
||||||
|
// write output to a bin directory for easier comparison
|
||||||
|
string outputRegeneratedFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
|
||||||
|
@"ObjectExplorerServiceTests\Baselines\Regenerated");
|
||||||
|
string outputRegeneratedFilePath = Path.Combine(outputRegeneratedFolder, baselineFileName);
|
||||||
|
string msg = "";
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(outputRegeneratedFolder);
|
||||||
|
File.WriteAllText(outputRegeneratedFilePath, actual);
|
||||||
|
msg = $"Generated output written to :\t{outputRegeneratedFilePath}\n\t" +
|
||||||
|
$"Baseline output located at :\t{GetBaseLineFile(baselineFileName)}";
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
//We don't want to fail the test completely if we failed to write the regenerated baseline
|
||||||
|
//(especially if the test passed).
|
||||||
|
msg = $"Errors also occurred while attempting to write the new baseline file {outputRegeneratedFilePath} : {e.Message}";
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.That(actual, Is.EqualTo(baseline), $"Baseline comparison for {baselineFileName} failed\n\t" + msg);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -133,8 +133,9 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
{
|
{
|
||||||
testServerNameFilePath = FileUtils.TestServerNamesDefaultFileName;
|
testServerNameFilePath = FileUtils.TestServerNamesDefaultFileName;
|
||||||
}
|
}
|
||||||
|
Console.WriteLine($"Test server name file path: {testServerNameFilePath}");
|
||||||
string testServerNamesFileContent = string.IsNullOrEmpty(testServerNameFilePath) ? string.Empty : File.ReadAllText(testServerNameFilePath);
|
string testServerNamesFileContent = string.IsNullOrEmpty(testServerNameFilePath) ? string.Empty : File.ReadAllText(testServerNameFilePath);
|
||||||
|
Console.WriteLine($"Test server name file content: {testServerNamesFileContent}");
|
||||||
return testServerNamesFileContent;
|
return testServerNamesFileContent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,7 +172,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
}
|
}
|
||||||
|
|
||||||
string settingsFileContents = string.IsNullOrEmpty(settingsFileName) ? string.Empty : File.ReadAllText(settingsFileName);
|
string settingsFileContents = string.IsNullOrEmpty(settingsFileName) ? string.Empty : File.ReadAllText(settingsFileName);
|
||||||
|
Console.WriteLine($"SQL Connection settings file content: {settingsFileContents}");
|
||||||
return settingsFileContents;
|
return settingsFileContents;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
public const string DefaultSqlAzureV12InstanceKey = "defaultSqlAzureV12";
|
public const string DefaultSqlAzureV12InstanceKey = "defaultSqlAzureV12";
|
||||||
public const string DefaultSql2016InstanceKey = "defaultSql2016";
|
public const string DefaultSql2016InstanceKey = "defaultSql2016";
|
||||||
public const string DefaultSql2019InstanceKey = "defaultSql2019";
|
public const string DefaultSql2019InstanceKey = "defaultSql2019";
|
||||||
|
public const string DefaultSql2022InstanceKey = "defaultSql2022";
|
||||||
public const string DefaultSqlvNextInstanceKey = "defaultSqlvNext";
|
public const string DefaultSqlvNextInstanceKey = "defaultSqlvNext";
|
||||||
|
|
||||||
private TestConnectionProfileService()
|
private TestConnectionProfileService()
|
||||||
@@ -72,11 +73,16 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
get { return GetInstance(DefaultSql2016InstanceKey); }
|
get { return GetInstance(DefaultSql2016InstanceKey); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static InstanceInfo DefaultSql2019
|
public static InstanceInfo DefaultSql2019
|
||||||
{
|
{
|
||||||
get { return GetInstance(DefaultSql2019InstanceKey); }
|
get { return GetInstance(DefaultSql2019InstanceKey); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static InstanceInfo DefaultSql2022
|
||||||
|
{
|
||||||
|
get { return GetInstance(DefaultSql2022InstanceKey); }
|
||||||
|
}
|
||||||
|
|
||||||
public static InstanceInfo DefaultSqlvNext
|
public static InstanceInfo DefaultSqlvNext
|
||||||
{
|
{
|
||||||
get { return GetInstance(DefaultSqlvNextInstanceKey); }
|
get { return GetInstance(DefaultSqlvNextInstanceKey); }
|
||||||
@@ -93,7 +99,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
return instanceInfo;
|
return instanceInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConnectParams GetConnectionParameters(string key = DefaultSql2019InstanceKey, string databaseName = null)
|
public ConnectParams GetConnectionParameters(string key = DefaultSql2022InstanceKey, string databaseName = null)
|
||||||
{
|
{
|
||||||
InstanceInfo instanceInfo = GetInstance(key);
|
InstanceInfo instanceInfo = GetInstance(key);
|
||||||
if (instanceInfo != null)
|
if (instanceInfo != null)
|
||||||
@@ -111,7 +117,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
public ConnectParams GetConnectionParameters(TestServerType serverType = TestServerType.OnPrem, string databaseName = null)
|
public ConnectParams GetConnectionParameters(TestServerType serverType = TestServerType.OnPrem, string databaseName = null)
|
||||||
{
|
{
|
||||||
string key = ConvertServerTypeToVersionKey(serverType);
|
string key = ConvertServerTypeToVersionKey(serverType);
|
||||||
return GetConnectionParameters(key, databaseName);
|
return GetConnectionParameters(key, databaseName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -134,7 +140,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
foreach (var serverIdentity in testServers)
|
foreach (var serverIdentity in testServers)
|
||||||
{
|
{
|
||||||
var instance = settings != null ? settings.GetConnectionProfile(serverIdentity.ProfileName, serverIdentity.ServerName) : null;
|
var instance = settings != null ? settings.GetConnectionProfile(serverIdentity.ProfileName, serverIdentity.ServerName) : null;
|
||||||
if (instance.ServerType == TestServerType.None)
|
if (instance?.ServerType == TestServerType.None)
|
||||||
{
|
{
|
||||||
instance.ServerType = serverIdentity.ServerType;
|
instance.ServerType = serverIdentity.ServerType;
|
||||||
AddInstance(instance);
|
AddInstance(instance);
|
||||||
@@ -149,7 +155,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Assert.True(false, "Fail to load the SQL connection instances. error: " + ex.Message);
|
Assert.True(false, "Fail to load the SQL connection instances. error: " + ex.Message);
|
||||||
}
|
}
|
||||||
@@ -157,6 +163,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
|
|
||||||
private static void AddInstance(InstanceInfo instance)
|
private static void AddInstance(InstanceInfo instance)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine($"Checking whether instance should be added to connections cache, server type: {instance.ServerType.ToString()}, version key: {instance.VersionKey}");
|
||||||
if (instance != null && (instance.ServerType != TestServerType.None || !string.IsNullOrEmpty(instance.VersionKey)))
|
if (instance != null && (instance.ServerType != TestServerType.None || !string.IsNullOrEmpty(instance.VersionKey)))
|
||||||
{
|
{
|
||||||
TestServerType serverType = instance.ServerType == TestServerType.None ? TestServerType.OnPrem : instance.ServerType; //Default to onPrem
|
TestServerType serverType = instance.ServerType == TestServerType.None ? TestServerType.OnPrem : instance.ServerType; //Default to onPrem
|
||||||
@@ -170,13 +177,22 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
instance.Password = credential.Password;
|
instance.Password = credential.Password;
|
||||||
}
|
}
|
||||||
connectionProfilesCache.Add(versionKey, instance);
|
connectionProfilesCache.Add(versionKey, instance);
|
||||||
|
Console.WriteLine("Instance added.");
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Instance already in the cache.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Instance skipped.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string ConvertServerTypeToVersionKey(TestServerType serverType)
|
private static string ConvertServerTypeToVersionKey(TestServerType serverType)
|
||||||
{
|
{
|
||||||
return serverType == TestServerType.OnPrem ? DefaultSql2019InstanceKey : DefaultSqlAzureV12InstanceKey;
|
return serverType == TestServerType.OnPrem ? DefaultSql2022InstanceKey : DefaultSqlAzureV12InstanceKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -51,6 +51,59 @@ NodeType: Index Label: NonClusteredIndex-Login (Non-Unique, Non-Clustered) SubTy
|
|||||||
NodeType: Index Label: PK_Employee_BusinessEntityID (Unique, Clustered) SubType:PrimaryKey Status:
|
NodeType: Index Label: PK_Employee_BusinessEntityID (Unique, Clustered) SubType:PrimaryKey Status:
|
||||||
NodeType: Statistic Label: NonClusteredIndex-Login SubType: Status:
|
NodeType: Statistic Label: NonClusteredIndex-Login SubType: Status:
|
||||||
NodeType: Statistic Label: PK_Employee_BusinessEntityID SubType: Status:
|
NodeType: Statistic Label: PK_Employee_BusinessEntityID SubType: Status:
|
||||||
|
NodeType: Table Label: HumanResources.Employee_Ledger (Updatable Ledger) SubType:Ledger Status:
|
||||||
|
NodeType: Column Label: BusinessEntityID (int, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: NationalIDNumber (nvarchar(15), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: LoginID (nvarchar(256), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: OrganizationNode (hierarchyid, null) SubType: Status:
|
||||||
|
NodeType: Column Label: OrganizationLevel (Computed, smallint, null) SubType: Status:
|
||||||
|
NodeType: Column Label: JobTitle (nvarchar(50), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: BirthDate (date, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: MaritalStatus (nchar(1), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: Gender (nchar(1), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: HireDate (date, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: VacationHours (smallint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: SickLeaveHours (smallint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_start_transaction_id (bigint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_end_transaction_id (bigint, null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_start_sequence_number (bigint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_end_sequence_number (bigint, null) SubType: Status:
|
||||||
|
NodeType: HistoryTable Label: HumanResources.Employee_Ledger_History (History) SubType:LedgerHistory Status:
|
||||||
|
NodeType: Column Label: BusinessEntityID (int, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: NationalIDNumber (nvarchar(15), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: LoginID (nvarchar(256), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: OrganizationNode (hierarchyid, null) SubType: Status:
|
||||||
|
NodeType: Column Label: OrganizationLevel (smallint, null) SubType: Status:
|
||||||
|
NodeType: Column Label: JobTitle (nvarchar(50), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: BirthDate (date, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: MaritalStatus (nchar(1), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: Gender (nchar(1), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: HireDate (date, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: VacationHours (smallint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: SickLeaveHours (smallint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_start_transaction_id (bigint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_end_transaction_id (bigint, null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_start_sequence_number (bigint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_end_sequence_number (bigint, null) SubType: Status:
|
||||||
|
NodeType: Table Label: HumanResources.Employee_Ledger_AppendOnly (Append-Only Ledger) SubType:Ledger Status:
|
||||||
|
NodeType: Column Label: BusinessEntityID (int, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: NationalIDNumber (nvarchar(15), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: LoginID (nvarchar(256), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: OrganizationNode (hierarchyid, null) SubType: Status:
|
||||||
|
NodeType: Column Label: OrganizationLevel (Computed, smallint, null) SubType: Status:
|
||||||
|
NodeType: Column Label: JobTitle (nvarchar(50), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: BirthDate (date, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: MaritalStatus (nchar(1), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: Gender (nchar(1), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: HireDate (date, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: SalariedFlag (Flag(bit), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: VacationHours (smallint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: SickLeaveHours (smallint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: CurrentFlag (Flag(bit), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: rowguid (uniqueidentifier, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ModifiedDate (datetime, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_start_transaction_id (bigint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_start_sequence_number (bigint, not null) SubType: Status:
|
||||||
NodeType: Table Label: HumanResources.Employee_Temporal (System-Versioned) SubType:Temporal Status:
|
NodeType: Table Label: HumanResources.Employee_Temporal (System-Versioned) SubType:Temporal Status:
|
||||||
NodeType: Column Label: BusinessEntityID (PK, int, not null) SubType: Status:
|
NodeType: Column Label: BusinessEntityID (PK, int, not null) SubType: Status:
|
||||||
NodeType: Column Label: NationalIDNumber (nvarchar(15), not null) SubType: Status:
|
NodeType: Column Label: NationalIDNumber (nvarchar(15), not null) SubType: Status:
|
||||||
@@ -107,6 +160,44 @@ NodeType: Constraint Label: DF_Person_ModifiedDate SubType: Status:
|
|||||||
NodeType: Trigger Label: TableTrigger SubType: Status:
|
NodeType: Trigger Label: TableTrigger SubType: Status:
|
||||||
NodeType: Index Label: PK_Person_BusinessEntityID (Unique, Clustered) SubType:PrimaryKey Status:
|
NodeType: Index Label: PK_Person_BusinessEntityID (Unique, Clustered) SubType:PrimaryKey Status:
|
||||||
NodeType: Statistic Label: PK_Person_BusinessEntityID SubType: Status:
|
NodeType: Statistic Label: PK_Person_BusinessEntityID SubType: Status:
|
||||||
|
NodeType: View Label: HumanResources.Employee_Ledger_AppendOnly_Ledger (Ledger) SubType:Ledger Status:
|
||||||
|
NodeType: Column Label: BusinessEntityID (int, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: NationalIDNumber (nvarchar(15), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: LoginID (nvarchar(256), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: OrganizationNode (hierarchyid, null) SubType: Status:
|
||||||
|
NodeType: Column Label: OrganizationLevel (smallint, null) SubType: Status:
|
||||||
|
NodeType: Column Label: JobTitle (nvarchar(50), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: BirthDate (date, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: MaritalStatus (nchar(1), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: Gender (nchar(1), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: HireDate (date, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: SalariedFlag (Flag(bit), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: VacationHours (smallint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: SickLeaveHours (smallint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: CurrentFlag (Flag(bit), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: rowguid (uniqueidentifier, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ModifiedDate (datetime, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_transaction_id (bigint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_sequence_number (bigint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_operation_type (int, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_operation_type_desc (nvarchar(6), not null) SubType: Status:
|
||||||
|
NodeType: View Label: HumanResources.Employee_Ledger_Ledger (Ledger) SubType:Ledger Status:
|
||||||
|
NodeType: Column Label: BusinessEntityID (int, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: NationalIDNumber (nvarchar(15), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: LoginID (nvarchar(256), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: OrganizationNode (hierarchyid, null) SubType: Status:
|
||||||
|
NodeType: Column Label: OrganizationLevel (smallint, null) SubType: Status:
|
||||||
|
NodeType: Column Label: JobTitle (nvarchar(50), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: BirthDate (date, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: MaritalStatus (nchar(1), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: Gender (nchar(1), not null) SubType: Status:
|
||||||
|
NodeType: Column Label: HireDate (date, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: VacationHours (smallint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: SickLeaveHours (smallint, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_transaction_id (bigint, null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_sequence_number (bigint, null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_operation_type (int, not null) SubType: Status:
|
||||||
|
NodeType: Column Label: ledger_operation_type_desc (nvarchar(6), not null) SubType: Status:
|
||||||
NodeType: View Label: HumanResources.vEmployee SubType: Status:
|
NodeType: View Label: HumanResources.vEmployee SubType: Status:
|
||||||
NodeType: Column Label: BusinessEntityID (int, not null) SubType: Status:
|
NodeType: Column Label: BusinessEntityID (int, not null) SubType: Status:
|
||||||
NodeType: Column Label: Title (nvarchar(8), null) SubType: Status:
|
NodeType: Column Label: Title (nvarchar(8), null) SubType: Status:
|
||||||
|
|||||||