public override List <SynchronizationItem> GetAlterItems(DatabaseObjectBase target, bool ignoreCase, bool condensed) { if (target != null && condensed) { return(new List <SynchronizationItem>()); } var items = base.GetAlterItems(target, ignoreCase, condensed); if (target != null) { var targetKey = target as KeyConstraint; var childKeys = from t in DatabaseObject.Parent.Schema.Tables from fk in t.ForeignKeys where fk.ParentTable.TableName == targetKey.Parent.ObjectName select fk; foreach (var childKey in childKeys) { var childSync = new ForeignKeySynchronization(TargetDatabase, childKey); var item = new SynchronizationItem(childKey); foreach (var dropItem in childSync.GetDropItems(childKey)) { item.Differences.AddRange(dropItem.Differences); foreach (var script in dropItem.Scripts) { item.AddScript(-1, script.Value.ToString()); } } foreach (var createItem in childSync.GetCreateItems()) { item.Differences.AddRange(createItem.Differences); foreach (var script in createItem.Scripts) { item.AddScript(100, script.Value.ToString()); } } items.Add(item); } } return(items); }
//public override List<Difference> GetDifferences(DatabaseObjectBase target) //{ // return (from si in GetSynchronizationItems(target) // from d in si.Differences // select d).ToList(); //} //public override List<Difference> GetDifferences(DatabaseObjectBase target) //{ // var diffs = base.GetDifferences(target); // foreach (var col in databaseObject.Columns) // { // diffs.AddRange(new ColumnSynchronization(col).GetDifferences(target == null ? null : (target as Table).Columns.FirstOrDefault(x => x.ColumnName == col.ColumnName))); // } // foreach (var i in databaseObject.Indexes) // { // diffs.AddRange(new IndexSynchronization(i).GetDifferences(target == null ? null : (target as Table).Indexes.FirstOrDefault(x => x.IndexName == i.IndexName))); // } // foreach (var kc in databaseObject.KeyConstraints) // { // diffs.AddRange(new KeyConstraintSynchronization(kc).GetDifferences(target == null ? null : (target as Table).KeyConstraints.FirstOrDefault(x => x.ConstraintName == kc.ConstraintName))); // } // foreach (var fk in databaseObject.ForeignKeys) // { // diffs.AddRange(new ForeignKeySynchronization(fk).GetDifferences(target == null ? null : (target as Table).ForeignKeys.FirstOrDefault(x => x.ForeignKeyName == fk.ForeignKeyName))); // } // foreach (var dc in databaseObject.DefaultConstraints) // { // diffs.AddRange(new DefaultConstraintSynchronization(dc).GetDifferences(target == null ? null : (target as Table).DefaultConstraints.FirstOrDefault(x => x.ConstraintName == dc.ConstraintName))); // } // foreach (var t in databaseObject.Triggers) // { // diffs.AddRange(new TriggerSynchronization(t).GetDifferences(target == null ? null : (target as Table).Triggers.FirstOrDefault(x => x.TriggerName == t.TriggerName))); // } // return diffs; //} private SynchronizationItem getRecreateTableItem(Table targetTable, bool ignoreCase) { var item = new SynchronizationItem(DatabaseObject); var tmpTable = "#tmp" + Guid.NewGuid().ToString().Replace("-", "_"); item.AddScript(0, string.Format("SELECT * INTO {0} FROM [{1}].[{2}]", tmpTable, DatabaseObject.Schema.SchemaName, DatabaseObject.TableName )); var foreignKeys = from s in targetTable.Schema.Database.Schemas from t in s.Tables from fk in t.ForeignKeys where string.Compare(fk.ParentTable.ObjectName, DatabaseObject.ObjectName, ignoreCase) == 0 || string.Compare(fk.ChildTable.ObjectName, DatabaseObject.ObjectName, ignoreCase) == 0 select fk; foreach (var fk in foreignKeys) { var dropItems = new ForeignKeySynchronization(TargetDatabase, fk).GetDropItems(DatabaseObject); foreach (var di in dropItems) { foreach (var s in di.Scripts) { item.AddScript(4, s.Value.ToString()); } } } item.AddScript(4, string.Format("DROP TABLE [{0}].[{1}]", DatabaseObject.Schema.SchemaName, DatabaseObject.TableName)); item.AddScript(5, getCreateScript()); if (DatabaseObject.Columns.Any(c => c.IsIdentity)) { item.AddScript(6, string.Format("SET IDENTITY_INSERT [{0}].[{1}] ON", DatabaseObject.Schema.SchemaName, DatabaseObject.TableName)); } item.AddScript(6, string.Format("INSERT INTO [{0}].[{1}] ({2}) SELECT {2} FROM [{3}]", DatabaseObject.Schema.SchemaName, DatabaseObject.TableName, string.Join(",", DatabaseObject.Columns.Where(c => c.ColumnType.DataType != DataType.RowVersion).Select(c => "[" + c.ColumnName + "]").ToArray()), tmpTable)); if (DatabaseObject.Columns.Any(c => c.IsIdentity)) { item.AddScript(6, string.Format("SET IDENTITY_INSERT [{0}].[{1}] OFF", DatabaseObject.Schema.SchemaName, DatabaseObject.TableName)); } foreach (var fk in foreignKeys) { foreach (var i in new ForeignKeySynchronization(TargetDatabase, fk).GetCreateItems()) { foreach (var kvp in i.Scripts.Where(s => s.Value.Length > 0)) { item.AddScript(7, kvp.Value.ToString()); } } } item.AddScript(7, string.Format("DROP TABLE [{0}]", tmpTable)); return(item); }