Example #1
0
        public void TestScript()
        {
            var person = new Table("dbo", "Person");
            person.Columns.Add(new Column("id", "int", false, null));
            person.Columns.Add(new Column("name", "varchar", 50, false, null));
            person.Columns.Find("id").Identity = new Identity(1, 1);
            person.Constraints.Add(new Constraint("PK_Person", "PRIMARY KEY", "id"));

            var address = new Table("dbo", "Address");
            address.Columns.Add(new Column("id", "int", false, null));
            address.Columns.Add(new Column("personId", "int", false, null));
            address.Columns.Add(new Column("street", "varchar", 50, false, null));
            address.Columns.Add(new Column("city", "varchar", 50, false, null));
            address.Columns.Add(new Column("state", "char", 2, false, null));
            address.Columns.Add(new Column("zip", "varchar", 5, false, null));
            address.Columns.Find("id").Identity = new Identity(1, 1);
            address.Constraints.Add(new Constraint("PK_Address", "PRIMARY KEY", "id"));

            var fk = new ForeignKey(address, "FK_Address_Person", "personId", person, "id", "", "CASCADE");

            TestHelper.ExecSql(person.ScriptCreate(), "");
            TestHelper.ExecSql(address.ScriptCreate(), "");
            TestHelper.ExecSql(fk.ScriptCreate(), "");
            TestHelper.ExecSql("drop table Address", "");
            TestHelper.ExecSql("drop table Person", "");
        }
Example #2
0
        public DatabaseDiff Compare(Database db)
        {
            var diff = new DatabaseDiff();

            diff.Db = db;

            //compare database properties
            foreach (DbProp p in Props)
            {
                DbProp p2 = db.FindProp(p.Name);
                if (p.Script() != p2.Script())
                {
                    diff.PropsChanged.Add(p);
                }
            }

            //get tables added and changed
            foreach (Table t in Tables)
            {
                Table t2 = db.FindTable(t.Name, t.Owner);
                if (t2 == null)
                {
                    diff.TablesAdded.Add(t);
                }
                else
                {
                    //compare mutual tables
                    TableDiff tDiff = t.Compare(t2);
                    if (tDiff.IsDiff)
                    {
                        diff.TablesDiff.Add(tDiff);
                    }
                }
            }
            //get deleted tables
            foreach (Table t in db.Tables)
            {
                if (FindTable(t.Name, t.Owner) == null)
                {
                    diff.TablesDeleted.Add(t);
                }
            }

            //get procs added and changed
            foreach (Routine r in Routines)
            {
                Routine r2 = db.FindRoutine(r.Name, r.Schema);
                if (r2 == null)
                {
                    diff.RoutinesAdded.Add(r);
                }
                else
                {
                    //compare mutual procs
                    if (r.Text != r2.Text)
                    {
                        diff.RoutinesDiff.Add(r);
                    }
                }
            }
            //get procs deleted
            foreach (Routine r in db.Routines)
            {
                if (FindRoutine(r.Name, r.Schema) == null)
                {
                    diff.RoutinesDeleted.Add(r);
                }
            }

            //get added and compare mutual foreign keys
            foreach (ForeignKey fk in ForeignKeys)
            {
                ForeignKey fk2 = db.FindForeignKey(fk.Name);
                if (fk2 == null)
                {
                    diff.ForeignKeysAdded.Add(fk);
                }
                else
                {
                    if (fk.ScriptCreate() != fk2.ScriptCreate())
                    {
                        diff.ForeignKeysDiff.Add(fk);
                    }
                }
            }
            //get deleted foreign keys
            foreach (ForeignKey fk in db.ForeignKeys)
            {
                if (FindForeignKey(fk.Name) == null)
                {
                    diff.ForeignKeysDeleted.Add(fk);
                }
            }

            return(diff);
        }