Ejemplo n.º 1
0
        public void Execute(DatabaseTable baseTable, DatabaseTable compareTable)
        {
            //find new columns (in compare, but not in base)
            foreach (var column in compareTable.Columns)
            {
                var name  = column.Name;
                var match = baseTable.Columns.FirstOrDefault(t => t.Name == name);
                if (match != null)
                {
                    continue;
                }
                var script = "-- ADDED TABLE " + column.TableName + " COLUMN " + name + Environment.NewLine +
                             _writer.AddColumn(compareTable, column);
                CreateResult(ResultType.Add, baseTable, name, script);
            }

            //find dropped and existing columns
            foreach (var column in baseTable.Columns)
            {
                var name  = column.Name;
                var match = compareTable.Columns.FirstOrDefault(t => t.Name == name);
                if (match == null)
                {
                    CreateResult(ResultType.Delete, baseTable, name,
                                 _writer.DropColumn(baseTable, column));
                    continue;
                }

                //has column changed?

                if (string.Equals(column.DbDataType, match.DbDataType, StringComparison.OrdinalIgnoreCase) &&
                    column.Length == match.Length &&
                    column.Precision == match.Precision &&
                    column.Scale == match.Scale &&
                    column.Nullable == match.Nullable)
                {
                    //we don't check IDENTITY
                    continue; //the same, no action
                }

                CreateResult(ResultType.Change, baseTable, name,
                             _writer.AlterColumn(baseTable, match, column));
            }
        }
Ejemplo n.º 2
0
        public void Execute(DatabaseTable baseTable, DatabaseTable compareTable)
        {
            //find new columns (in compare, but not in base)
            foreach (var column in compareTable.Columns)
            {
                var name  = column.Name;
                var match = baseTable.Columns.FirstOrDefault(t => t.Name == name);
                if (match != null)
                {
                    continue;
                }
                _sb.AppendLine("-- ADDED TABLE " + column.TableName + " COLUMN " + name);
                _sb.AppendLine(_writer.AddColumn(compareTable, column));
            }

            //find dropped and existing columns
            foreach (var column in baseTable.Columns)
            {
                var name  = column.Name;
                var match = compareTable.Columns.FirstOrDefault(t => t.Name == name);
                if (match == null)
                {
                    _sb.AppendLine(_writer.DropColumn(baseTable, column));
                    continue;
                }

                //has column changed?

                if (column.DbDataType == match.DbDataType &&
                    column.Length == match.Length &&
                    column.Precision == match.Precision &&
                    column.Scale == match.Scale &&
                    column.Nullable == match.Nullable)
                {
                    //we don't check IDENTITY
                    continue; //the same, no action
                }

                _sb.AppendLine(_writer.AlterColumn(baseTable, match, column));
            }
        }
Ejemplo n.º 3
0
        public void Execute(DatabaseTable baseTable, DatabaseTable compareTable)
        {
            //find new columns (in compare, but not in base)
            var copy = baseTable.Clone();

            foreach (var column in compareTable.Columns)
            {
                var name  = column.Name;
                var match = baseTable.Columns.FirstOrDefault(t => t.Name == name);
                if (match != null)
                {
                    continue;
                }
                var script = "-- ADDED TABLE " + column.TableName + " COLUMN " + name + Environment.NewLine +
                             _writer.AddColumn(compareTable, column);
                copy.AddColumn(column);
                CreateResult(ResultType.Add, baseTable, name, script);
            }

            //find dropped and existing columns
            var toDrop  = new Dictionary <string, DatabaseColumn>();
            var toAlter = new Dictionary <string, DatabaseColumn[]>();

            foreach (var column in baseTable.Columns)
            {
                var name  = column.Name;
                var match = compareTable.Columns.FirstOrDefault(t => t.Name == name);
                if (match == null)
                {
                    toDrop.Add(name, column);
                    continue;
                }

                //has column changed?

                if (string.Equals(column.DbDataType, match.DbDataType, StringComparison.OrdinalIgnoreCase) &&
                    column.Length == match.Length &&
                    column.Precision == match.Precision &&
                    column.Scale == match.Scale &&
                    column.Nullable == match.Nullable)
                {
                    //we don't check IDENTITY
                    continue; //the same, no action
                }
                toAlter.Add(name, new[] { match, column });
            }

            //write drops and alters as last step to ensure valid queries
            foreach (var kv in toAlter)
            {
                copy.Columns.Remove(kv.Value[1]);
                copy.Columns.Add(kv.Value[0]);
                CreateResult(ResultType.Change, baseTable, kv.Key,
                             _writer.AlterColumn(copy, kv.Value[0], kv.Value[1]));
            }

            foreach (var kv in toDrop)
            {
                copy.Columns.Remove(kv.Value);
                CreateResult(ResultType.Delete, baseTable, kv.Key,
                             _writer.DropColumn(copy, kv.Value));
                continue;
            }
        }