コード例 #1
0
        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);
        }
コード例 #2
0
        //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);
        }