diff --git a/KustoSchemaTools/Changes/DatabaseChanges.cs b/KustoSchemaTools/Changes/DatabaseChanges.cs index b1ab853..932ffb4 100644 --- a/KustoSchemaTools/Changes/DatabaseChanges.cs +++ b/KustoSchemaTools/Changes/DatabaseChanges.cs @@ -1,5 +1,6 @@ using KustoSchemaTools.Model; using Microsoft.Extensions.Logging; +using System.Data; namespace KustoSchemaTools.Changes { @@ -43,7 +44,7 @@ public static List GenerateChanges(Database oldState, Database newState result.AddRange(GenerateDeletions(oldState, newState.Deletions, log)); - result.AddRange(GenerateScriptCompareChanges(oldState, newState, db => db.Tables, nameof(newState.Tables), log)); + result.AddRange(GenerateScriptCompareChanges(oldState, newState, db => db.Tables, nameof(newState.Tables), log, (oldItem, newItem) => oldItem != null || newItem.Columns?.Any() == true)); result.AddRange(GenerateScriptCompareChanges(oldState, newState, db => db.MaterializedViews, nameof(newState.MaterializedViews), log)); result.AddRange(GenerateScriptCompareChanges(oldState, newState, db => db.ContinuousExports, nameof(newState.ContinuousExports), log)); result.AddRange(GenerateScriptCompareChanges(oldState, newState, db => db.Functions, nameof(newState.Functions), log)); @@ -132,7 +133,9 @@ private static List GenerateEntityGroupChanges(Database oldState, Datab return changes; } - private static List GenerateScriptCompareChanges(Database oldState, Database newState,Func> entitySelector,string entityName, ILogger log) where T: IKustoBaseEntity + + + private static List GenerateScriptCompareChanges(Database oldState, Database newState,Func> entitySelector,string entityName, ILogger log, Func validator = null) where T: IKustoBaseEntity { var tmp = new List(); var existing = entitySelector(oldState) ?? new Dictionary(); @@ -143,6 +146,12 @@ private static List GenerateScriptCompareChanges(Database oldState, foreach (var item in newItems) { + var existingOldItem = existing.ContainsKey(item.Key) ? existing[item.Key] : default(T); + if(validator != null && !validator(existingOldItem, item.Value)) + { + log.LogInformation($"Skipping {entityName} {item.Key} as it failed validation"); + continue; + } if (existing.ContainsKey(item.Key)) { var change = new ScriptCompareChange(item.Key, existing[item.Key], item.Value);