public string ScriptCreate(Database db) { string script = ""; bool defaultQuotedId = !QuotedId; if (db != null && db.FindProp("QUOTED_IDENTIFIER") != null) { defaultQuotedId = db.FindProp("QUOTED_IDENTIFIER").Value == "ON"; } if (defaultQuotedId != QuotedId) { script = string.Format(@"SET QUOTED_IDENTIFIER {0} {1}GO{1}", (QuotedId ? "ON" : "OFF"), Environment.NewLine); } bool defaultAnsiNulls = !AnsiNull; if (db != null && db.FindProp("ANSI_NULLS") != null) { defaultAnsiNulls = db.FindProp("ANSI_NULLS").Value == "ON"; } if (defaultAnsiNulls != AnsiNull) { script = string.Format(@"SET ANSI_NULLS {0} {1}GO{1}", (AnsiNull ? "ON" : "OFF"), Environment.NewLine); } return script + Text; }
public void TestCollate() { string pathToSchema = ConfigHelper.TestSchemaDir + "/SANDBOX3_GBL.SQL"; TestHelper.DropDb("TEST_SOURCE"); //create the db from sql script TestHelper.ExecSql("CREATE DATABASE TEST_SOURCE", ""); TestHelper.ExecBatchSql(File.ReadAllText(pathToSchema), "TEST_SOURCE"); //load the model from newly created db and check collation var copy = new Database("TEST_COPY"); copy.Connection = TestHelper.GetConnString("TEST_SOURCE"); copy.Load(); Assert.AreEqual("SQL_Latin1_General_CP1_CI_AS", copy.FindProp("COLLATE").Value); }
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); }
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; }
public DatabaseDiff Compare(Database otherDb, CompareConfig compareConfig = null) { compareConfig = compareConfig ?? new CompareConfig(); var diff = new DatabaseDiff(); diff.Db = otherDb; if (!compareConfig.IgnoreProps) { //compare database properties foreach (DbProp p in Props) { DbProp p2 = otherDb.FindProp(p.Name); if (p.Script() != p2.Script()) { diff.PropsChanged.Add(p); } } } CompareTables(otherDb, compareConfig, diff); CompareRoutines(otherDb, compareConfig, diff); CompareForeignKeys(otherDb, compareConfig, diff); return diff; }
public DatabaseDiff Compare(Database db) { var diff = new DatabaseDiff(); diff.Db = db; //compare database properties foreach (DbProp p in from p in Props let p2 = db.FindProp(p.Name) where p.Script() != p2.Script() select p) { 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.Where(t => 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.Where(r => 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.Where(fk => FindForeignKey(fk.Name) == null)) { diff.ForeignKeysDeleted.Add(fk); } //get added and compare mutual assemblies foreach (SqlAssembly a in Assemblies) { SqlAssembly a2 = db.FindAssembly(a.Name); if (a2 == null) { diff.AssembliesAdded.Add(a); } else { if (a.ScriptCreate(this) != a2.ScriptCreate(db)) { diff.AssembliesDiff.Add(a); } } } //get deleted assemblies foreach (SqlAssembly a in db.Assemblies.Where(a => FindAssembly(a.Name) == null)) { diff.AssembliesDeleted.Add(a); } //get added and compare mutual users foreach (SqlUser u in Users) { SqlUser u2 = db.FindUser(u.Name); if (u2 == null) { diff.UsersAdded.Add(u); } else { if (u.ScriptCreate(this) != u2.ScriptCreate(db)) { diff.UsersDiff.Add(u); } } } //get deleted users foreach (SqlUser u in db.Users.Where(u => FindUser(u.Name) == null)) { diff.UsersDeleted.Add(u); } //get added and compare view indexes foreach (Constraint c in ViewIndexes) { Constraint c2 = db.FindViewIndex(c.Name); if (c2 == null) { diff.ViewIndexesAdded.Add(c); } else { if (c.Script() != c2.Script()) { diff.ViewIndexesDiff.Add(c); } } } //get deleted view indexes foreach (Constraint c in db.ViewIndexes.Where(c => FindViewIndex(c.Name) == null)) { diff.ViewIndexesDeleted.Add(c); } return diff; }
public void TestScriptToDir() { var policy = new Table("dbo", "Policy"); policy.Columns.Add(new Column("id", "int", false, null)); policy.Columns.Add(new Column("form", "tinyint", false, null)); policy.Constraints.Add(new Constraint("PK_Policy", "PRIMARY KEY", "id")); policy.Constraints[0].Clustered = true; policy.Constraints[0].Unique = true; policy.Columns.Items[0].Identity = new Identity(1, 1); var loc = new Table("dbo", "Location"); loc.Columns.Add(new Column("id", "int", false, null)); loc.Columns.Add(new Column("policyId", "int", false, null)); loc.Columns.Add(new Column("storage", "bit", false, null)); loc.Constraints.Add(new Constraint("PK_Location", "PRIMARY KEY", "id")); loc.Constraints[0].Clustered = true; loc.Constraints[0].Unique = true; loc.Columns.Items[0].Identity = new Identity(1, 1); var formType = new Table("dbo", "FormType"); formType.Columns.Add(new Column("code", "tinyint", false, null)); formType.Columns.Add(new Column("desc", "varchar", 10, false, null)); formType.Constraints.Add(new Constraint("PK_FormType", "PRIMARY KEY", "code")); formType.Constraints[0].Clustered = true; var fk_policy_formType = new ForeignKey("FK_Policy_FormType"); fk_policy_formType.Table = policy; fk_policy_formType.Columns.Add("form"); fk_policy_formType.RefTable = formType; fk_policy_formType.RefColumns.Add("code"); fk_policy_formType.OnUpdate = "NO ACTION"; fk_policy_formType.OnDelete = "NO ACTION"; var fk_location_policy = new ForeignKey("FK_Location_Policy"); fk_location_policy.Table = loc; fk_location_policy.Columns.Add("policyId"); fk_location_policy.RefTable = policy; fk_location_policy.RefColumns.Add("id"); fk_location_policy.OnUpdate = "NO ACTION"; fk_location_policy.OnDelete = "CASCADE"; var db = new Database("ScriptToDirTest"); db.Tables.Add(policy); db.Tables.Add(formType); db.Tables.Add(loc); db.ForeignKeys.Add(fk_policy_formType); db.ForeignKeys.Add(fk_location_policy); db.FindProp("COMPATIBILITY_LEVEL").Value = "120"; db.FindProp("COLLATE").Value = "SQL_Latin1_General_CP1_CI_AS"; db.FindProp("AUTO_CLOSE").Value = "OFF"; db.FindProp("AUTO_SHRINK").Value = "ON"; db.FindProp("ALLOW_SNAPSHOT_ISOLATION").Value = "ON"; db.FindProp("READ_COMMITTED_SNAPSHOT").Value = "OFF"; db.FindProp("RECOVERY").Value = "SIMPLE"; db.FindProp("PAGE_VERIFY").Value = "CHECKSUM"; db.FindProp("AUTO_CREATE_STATISTICS").Value = "ON"; db.FindProp("AUTO_UPDATE_STATISTICS").Value = "ON"; db.FindProp("AUTO_UPDATE_STATISTICS_ASYNC").Value = "ON"; db.FindProp("ANSI_NULL_DEFAULT").Value = "ON"; db.FindProp("ANSI_NULLS").Value = "ON"; db.FindProp("ANSI_PADDING").Value = "ON"; db.FindProp("ANSI_WARNINGS").Value = "ON"; db.FindProp("ARITHABORT").Value = "ON"; db.FindProp("CONCAT_NULL_YIELDS_NULL").Value = "ON"; db.FindProp("NUMERIC_ROUNDABORT").Value = "ON"; db.FindProp("QUOTED_IDENTIFIER").Value = "ON"; db.FindProp("RECURSIVE_TRIGGERS").Value = "ON"; db.FindProp("CURSOR_CLOSE_ON_COMMIT").Value = "ON"; db.FindProp("CURSOR_DEFAULT").Value = "LOCAL"; db.FindProp("TRUSTWORTHY").Value = "ON"; db.FindProp("DB_CHAINING").Value = "ON"; db.FindProp("PARAMETERIZATION").Value = "FORCED"; db.FindProp("DATE_CORRELATION_OPTIMIZATION").Value = "ON"; db.Connection = ConfigHelper.TestDB.Replace("database=TESTDB", "database=" + db.Name); db.ExecCreate(true); DBHelper.ExecSql(db.Connection, " insert into formType ([code], [desc]) values (1, 'DP-1')\n" + "insert into formType ([code], [desc]) values (2, 'DP-2')\n" + "insert into formType ([code], [desc]) values (3, 'DP-3')"); db.DataTables.Add(formType); db.Dir = db.Name; db.ScriptToDir(); Assert.IsTrue(Directory.Exists(db.Name)); Assert.IsTrue(Directory.Exists(db.Name + "\\data")); Assert.IsTrue(Directory.Exists(db.Name + "\\tables")); Assert.IsTrue(Directory.Exists(db.Name + "\\foreign_keys")); foreach (Table t in db.DataTables) { Assert.IsTrue(File.Exists(db.Name + "\\data\\" + t.Name + ".tsv")); } foreach (Table t in db.Tables) { Assert.IsTrue(File.Exists(db.Name + "\\tables\\" + t.Name + ".sql")); } foreach (string expected in db.ForeignKeys.Select(fk => db.Name + "\\foreign_keys\\" + fk.Table.Name + ".sql")) { Assert.IsTrue(File.Exists(expected), "File does not exist" + expected); } var copy = new Database("ScriptToDirTestCopy"); copy.Dir = db.Dir; copy.Connection = ConfigHelper.TestDB.Replace("database=TESTDB", "database=" + copy.Name); copy.CreateFromDir(true); copy.Load(); TestCompare(db, copy); }