Пример #1
0
 public void SaveCompare(string filename, bool overWrite = true)
 {
     if (SchemaComparison != null)
     {
         SchemaComparison.SaveToFile(filename, overWrite);
     }
 }
Пример #2
0
        private bool CompareDatabaseSchemas(string databaseName1, string databaseName2)
        {
            var initialConnectionString = Environment.GetEnvironmentVariable("SqlServer:ConnectionString") ?? LocalConnectionString;

            var testConnectionString1 = new SqlConnectionStringBuilder(initialConnectionString)
            {
                InitialCatalog = databaseName1
            }.ToString();
            var testConnectionString2 = new SqlConnectionStringBuilder(initialConnectionString)
            {
                InitialCatalog = databaseName2
            }.ToString();

            var source     = new SchemaCompareDatabaseEndpoint(testConnectionString1);
            var target     = new SchemaCompareDatabaseEndpoint(testConnectionString2);
            var comparison = new SchemaComparison(source, target)
            {
                Options = { IgnoreWhitespace = true, IgnoreComments = true },
            };

            SchemaComparisonResult result = comparison.Compare();

            // These types were introduced in earlier schema versions but are no longer used in newer versions.
            // They are not removed so as to no break compatibility with instances requiring an older schema version.
            // Exclude them from the schema comparison differences.
            (string type, string name)[] deprecatedObjectToIgnore =
Пример #3
0
 public void SaveToStream(Stream srteam)
 {
     if (SchemaComparison != null)
     {
         SchemaComparison.SaveToStream(srteam);
     }
 }
        public async Task GivenTwoSchemaInitializationMethods_WhenCreatingTwoDatabases_BothSchemasShouldBeEquivalent()
        {
            // Create two databases, one where we apply the the maximum supported version's snapshot SQL schema file
            SqlDataStoreTestsFixture snapshotFixture = new SqlDataStoreTestsFixture(SqlDataStoreTestsFixture.GenerateDatabaseName("SNAPSHOT"));

            // And one where we apply .diff.sql files to upgrade the schema version to the maximum supported version.
            SqlDataStoreTestsFixture diffFixture = new SqlDataStoreTestsFixture(SqlDataStoreTestsFixture.GenerateDatabaseName("DIFF"));

            await snapshotFixture.InitializeAsync(forceIncrementalSchemaUpgrade : false);

            await diffFixture.InitializeAsync(forceIncrementalSchemaUpgrade : true);

            SchemaCompareDatabaseEndpoint snapshotEndpoint = new SchemaCompareDatabaseEndpoint(snapshotFixture.TestConnectionString);
            SchemaCompareDatabaseEndpoint diffEndpoint     = new SchemaCompareDatabaseEndpoint(diffFixture.TestConnectionString);
            var comparison = new SchemaComparison(snapshotEndpoint, diffEndpoint);

            SchemaComparisonResult result = comparison.Compare();

            Assert.True(result.IsEqual);

            // cleanup if succeeds
            await snapshotFixture.DisposeAsync();

            await diffFixture.DisposeAsync();
        }
Пример #5
0
        private static void Main(string[] args)
        {
            var dbSqlServer = new SqlServerDbProvider().GetDatabase(ConnectionString);
            var dbModel     = new PostulateDbProvider().GetDatabase(@"C:\Users\Adam\Source\Repos\Hs5\Hs5.Models\bin\Debug\Hs5.Models.dll");
            var diff        = SchemaComparison.Execute(dbModel, dbSqlServer);

            Console.WriteLine("Create:");
            foreach (var grp in diff.Create.GroupBy(row => row.GetType().Name))
            {
                Console.WriteLine(grp.Key);
                foreach (var item in grp)
                {
                    Console.WriteLine($"- {item}");
                }
            }

            foreach (var cmd in diff.GetScriptCommands(new SqlServerSyntax()))
            {
                Console.WriteLine(cmd);
                Console.WriteLine("GO");
                Console.WriteLine();
            }

            Console.ReadLine();
        }
Пример #6
0
        static void Main(string[] args)
        {
            //Loop thru all the scmp from the directory. This set to max 2 thread that run parallel and update together
            Parallel.ForEach(Directory.GetFiles(schemaDirectory), new ParallelOptions {
                MaxDegreeOfParallelism = 2
            }, (file) =>
            {
                try
                {
                    // Load comparison from Schema Compare (.scmp) file
                    var comparison = new SchemaComparison(file);

                    Console.WriteLine("Processing " + Path.GetFileName(file));
                    Console.WriteLine("Comparing schema...");

                    SchemaComparisonResult comparisonResult = comparison.Compare();

                    // Publish the changes to the target database
                    Console.WriteLine("Publishing schema...");

                    SchemaComparePublishResult publishResult = comparisonResult.PublishChangesToTarget();

                    Console.WriteLine(publishResult.Success ? "Publish succeeded." : "Publish failed.");
                    Console.WriteLine(" ");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            });

            Console.ReadLine();
        }
Пример #7
0
 public SchemaComparison Initialize()
 {
     SourceEndPoint   = GetEndPoint(sourceConnectionString);
     TargetEndPoint   = GetEndPoint(targetConnectionString);
     SchemaComparison = new SchemaComparison(SourceEndPoint, TargetEndPoint);
     return(SchemaComparison);
 }
        public void Execute(TaskExecutionMode mode)
        {
            if (this.CancellationToken.IsCancellationRequested)
            {
                throw new OperationCanceledException(this.CancellationToken);
            }

            try
            {
                SchemaComparison compare = new SchemaComparison(this.Parameters.FilePath);

                // load xml file because some parsing still needs to be done
                this.scmpInfo = XDocument.Load(this.Parameters.FilePath);

                this.Result = new SchemaCompareOpenScmpResult()
                {
                    DeploymentOptions              = new DeploymentOptions(compare.Options),
                    Success                        = true,
                    SourceEndpointInfo             = this.GetEndpointInfo(true, compare.Source),
                    TargetEndpointInfo             = this.GetEndpointInfo(false, compare.Target),
                    OriginalTargetName             = this.GetOriginalTargetName(),
                    OriginalTargetConnectionString = this.GetOriginalTargetConnectionString(),
                    ExcludedSourceElements         = this.GetExcludedElements(compare.ExcludedSourceObjects),
                    ExcludedTargetElements         = this.GetExcludedElements(compare.ExcludedTargetObjects)
                };
            }
            catch (Exception e)
            {
                ErrorMessage = e.Message;
                Logger.Write(TraceEventType.Error, string.Format("Schema compare open scmp operation failed with exception {0}", e));
                throw;
            }
        }
Пример #9
0
        public IActionResult CompareSchema(SchemaComparison schemaComparison)
        {
            var includedConnectionStrings = _optionsService.ConnectionStrings.GetIncludedConnectionStrings(schemaComparison.ConfigConnections).ToArray();
            var identifiers = _databaseEntityRepository.GetIdentifiersFromSchema(_identifierService.GetIdentifierFromSchemaName(schemaComparison.SchemaName), includedConnectionStrings).Take(20);

            schemaComparison.ComparisonResults = GetComparisonsBetweenIdentifiers(includedConnectionStrings, identifiers);
            return(View("CompareSchema", schemaComparison));
        }
Пример #10
0
        public IActionResult CompareSchema()
        {
            var schemaComparisonModel = new SchemaComparison
            {
                ConfigConnections = _optionsService.ConnectionStrings.GetConnectionFilters().ToList()
            };

            return(View("CompareSchema", schemaComparisonModel));
        }
        public void ScmFileBasedCompare(string srcConString, string targetConString)
        {
            var src = new SqlConnectionStringBuilder(srcConString);

            var bacPacFile = GetDacFileName(srcConString) + ".dacpac";
            var dtVersion  = DateTime.Now.ToString("yyyy.MM.dd.HHmmss");

            //if Bac file not exists create new
            var dacService = new Microsoft.SqlServer.Dac.DacServices(srcConString);

            dacService.Extract(bacPacFile, src.InitialCatalog, "Test Application", Version.Parse(dtVersion));

            var sourceDacpac = new SchemaCompareDacpacEndpoint(bacPacFile);

            var target         = new SqlConnectionStringBuilder(targetConString);
            var targetDatabase = new SchemaCompareDatabaseEndpoint(targetConString);

            var comparison = new SchemaComparison(sourceDacpac, targetDatabase);

            // Persist comparison file to disk in Schema Compare (.scmp) format
            comparison.SaveToFile(@"C:\temp\mycomparison.scmp");

            // Load comparison from Schema Compare (.scmp) file
            comparison = new SchemaComparison(@"C:\temp\mycomparison.scmp");
            SchemaComparisonResult comparisonResult = comparison.Compare();

            foreach (var d in comparisonResult.Differences)
            {
                Console.WriteLine(d.SourceObject.GetScript());
            }



            // Find the change to table1 and exclude it.
            //foreach (SchemaDifference difference in comparisonResult.Differences)
            //{
            //    if (difference.TargetObject.Name != null &&
            //        difference.TargetObject.Name.HasName &&
            //        difference.TargetObject.Name.Parts[1] == "DbConnections")
            //    {
            //        comparisonResult.Exclude(difference);
            //        break;
            //    }
            //}


            // Publish the changes to the target database
            //SchemaComparePublishResult publishResult = comparisonResult.PublishChangesToTarget();
            var publishResult = comparisonResult.GenerateScript(".");


            Console.WriteLine(publishResult.MasterScript);
            Console.WriteLine(publishResult.Script);
            Console.WriteLine(publishResult.Success ? "Publish succeeded." : "Publish failed.");
        }
Пример #12
0
        public void Execute(TaskExecutionMode mode)
        {
            if (this.CancellationToken.IsCancellationRequested)
            {
                throw new OperationCanceledException(this.CancellationToken);
            }

            try
            {
                SchemaCompareEndpoint sourceEndpoint = SchemaCompareUtils.CreateSchemaCompareEndpoint(this.Parameters.SourceEndpointInfo, this.SourceConnectionInfo);
                SchemaCompareEndpoint targetEndpoint = SchemaCompareUtils.CreateSchemaCompareEndpoint(this.Parameters.TargetEndpointInfo, this.TargetConnectionInfo);

                SchemaComparison comparison = new SchemaComparison(sourceEndpoint, targetEndpoint);

                if (this.Parameters.DeploymentOptions != null)
                {
                    comparison.Options = SchemaCompareUtils.CreateSchemaCompareOptions(this.Parameters.DeploymentOptions);
                }

                // for testing
                schemaCompareStarted?.Invoke(this, new EventArgs());

                this.ComparisonResult = comparison.Compare(this.CancellationToken);

                // try one more time if it didn't work the first time
                if (!this.ComparisonResult.IsValid)
                {
                    this.ComparisonResult = comparison.Compare(this.CancellationToken);
                }

                // Since DacFx does not throw on schema comparison cancellation, throwing here explicitly to ensure consistency of behavior
                if (!this.ComparisonResult.IsValid && this.CancellationToken.IsCancellationRequested)
                {
                    throw new OperationCanceledException(this.CancellationToken);
                }

                this.Differences = new List <DiffEntry>();
                if (this.ComparisonResult.Differences != null)
                {
                    foreach (SchemaDifference difference in this.ComparisonResult.Differences)
                    {
                        DiffEntry diffEntry = SchemaCompareUtils.CreateDiffEntry(difference, null);
                        this.Differences.Add(diffEntry);
                    }
                }
            }
            catch (Exception e)
            {
                ErrorMessage = e.Message;
                Logger.Write(TraceEventType.Error, string.Format("Schema compare operation {0} failed with exception {1}", this.OperationId, e.Message));
                throw;
            }
        }
 public void Write(StringBuilder sb, SchemaComparison data)
 {
     sb.AppendLine("### Properties from `<m:properties>`");
     sb.AppendLine();
     sb.AppendLine("The following elements are available on every known server implementation.");
     sb.AppendLine();
     _markdownTableWriter.Write(
         sb,
         new[] { "Property Element", "Type" },
         data
         .DirectPropertiesOnAllTypes
         .OrderBy(x => x)
         .Select(x => new[] { $"`<d:{x}>`", data.PropertyTypes[x] }));
     sb.AppendLine();
     sb.AppendLine("The following properties vary from one server implementation to the next.");
     sb.AppendLine();
     _markdownTableWriter.Write(
         sb,
         new[] { "Property Element", "Type", "[Availability](#quirk-abbreviations)" },
         data
         .DirectPropertiesOnSomeTypes
         .OrderBy(x => x.Key)
         .Select(x => new[]
     {
         $"`<d:{x.Key}>`",
         data.PropertyTypes[x.Key],
         string.Join(" ", x
                     .Value
                     .Select(y => _abbreviations.AbbreviatePackageSourceType(y))
                     .OrderBy(y => y))
     }));
     sb.AppendLine();
     sb.AppendLine("The following properties must be fetched from Atom elements, instead of from the `<m:properties>` element. In other");
     sb.AppendLine("words, clients must check child elements of `<entry>` to get all package metadata on different server implementations.");
     sb.AppendLine();
     _markdownTableWriter.Write(
         sb,
         new[] { "Equivalent Property Element", "Atom Element", "[Availability](#quirk-abbreviations)" },
         data
         .OnlyUsesTargetPaths
         .SelectMany(x => x
                     .Value
                     .Select(y => new[]
     {
         $"`<d:{x.Key}>`",
         TargetPathToDisplay[y.Key],
         string.Join(" ", y
                     .Value
                     .Select(z => _abbreviations.AbbreviatePackageSourceType(z))
                     .OrderBy(z => z))
     }))
         .OrderBy(x => x[0]));
 }
Пример #14
0
        static void Main(string[] args)
        {
            var target  = new SchemaCompareDatabaseEndpoint(@"Data Source=localhost;Initial Catalog=Evolution;Integrated Security=True;Connect Timeout=30");
            var source  = new SchemaCompareDatabaseEndpoint(@"Data Source=localhost;Initial Catalog=qaDrmDevTrunk;Integrated Security=True;Connect Timeout=30");
            var compare = new SchemaComparison(source, target);

            var compRes = compare.Compare();
            var script  = compRes.GenerateScript("Evolution");


            Console.Read();
        }
Пример #15
0
        public void Execute(TaskExecutionMode mode = TaskExecutionMode.Execute)
        {
            if (this.CancellationToken.IsCancellationRequested)
            {
                throw new OperationCanceledException(this.CancellationToken);
            }

            try
            {
                SchemaCompareEndpoint sourceEndpoint = SchemaCompareUtils.CreateSchemaCompareEndpoint(this.Parameters.SourceEndpointInfo, this.SourceConnectionString);
                SchemaCompareEndpoint targetEndpoint = SchemaCompareUtils.CreateSchemaCompareEndpoint(this.Parameters.TargetEndpointInfo, this.TargetConnectionString);

                SchemaComparison comparison = new SchemaComparison(sourceEndpoint, targetEndpoint);

                if (Parameters.ExcludedSourceObjects != null)
                {
                    foreach (var sourceObj in this.Parameters.ExcludedSourceObjects)
                    {
                        SchemaComparisonExcludedObjectId excludedObjId = SchemaCompareUtils.CreateExcludedObject(sourceObj);
                        if (excludedObjId != null)
                        {
                            comparison.ExcludedSourceObjects.Add(excludedObjId);
                        }
                    }
                }

                if (Parameters.ExcludedTargetObjects != null)
                {
                    foreach (var targetObj in this.Parameters.ExcludedTargetObjects)
                    {
                        SchemaComparisonExcludedObjectId excludedObjId = SchemaCompareUtils.CreateExcludedObject(targetObj);
                        if (excludedObjId != null)
                        {
                            comparison.ExcludedTargetObjects.Add(excludedObjId);
                        }
                    }
                }

                if (this.Parameters.DeploymentOptions != null)
                {
                    comparison.Options = SchemaCompareUtils.CreateSchemaCompareOptions(this.Parameters.DeploymentOptions);
                }

                comparison.SaveToFile(this.Parameters.ScmpFilePath, true);
            }
            catch (Exception e)
            {
                ErrorMessage = e.Message;
                Logger.Write(TraceEventType.Error, string.Format("Schema compare save settings operation {0} failed with exception {1}", this.OperationId, e));
                throw;
            }
        }
        //#r "C:\Program Files\Microsoft SQL Server\140\DAC\bin\Microsoft.SqlServer.Dac.Extensions.dll"
        public void Compare()
        {
            var csb = new SqlConnectionStringBuilder
            {
                DataSource         = ".",
                InitialCatalog     = "ICareMVCMaster",
                IntegratedSecurity = true
            };
            var bacPacFile = @"C:\temp\icaremvcmaster.dacpac";
            var s          = new Microsoft.SqlServer.Dac.DacServices(csb.ConnectionString);

            s.Extract(bacPacFile, "IcareMVCMaster", "Test Application", new Version("1.1.1.1"));
            var sourceDacpac = new SchemaCompareDacpacEndpoint(bacPacFile);

            var csb2 = new SqlConnectionStringBuilder
            {
                DataSource         = ".",
                InitialCatalog     = "New_ICareMVCMaster",
                IntegratedSecurity = true
            };
            var targetDatabase = new SchemaCompareDatabaseEndpoint(csb2.ToString());

            var comparison = new SchemaComparison(sourceDacpac, targetDatabase);

            // Persist comparison file to disk in Schema Compare (.scmp) format
            comparison.SaveToFile(@"C:\temp\mycomparison.scmp");

            // Load comparison from Schema Compare (.scmp) file
            comparison = new SchemaComparison(@"C:\temp\mycomparison.scmp");
            SchemaComparisonResult comparisonResult = comparison.Compare();

            // Find the change to table1 and exclude it.
            //foreach (SchemaDifference difference in comparisonResult.Differences)
            //{
            //    if (difference.TargetObject.Name != null &&
            //        difference.TargetObject.Name.HasName &&
            //        difference.TargetObject.Name.Parts[1] == "DbConnections")
            //    {
            //        comparisonResult.Exclude(difference);
            //        break;
            //    }
            //}


            // Publish the changes to the target database
            //SchemaComparePublishResult publishResult = comparisonResult.PublishChangesToTarget();
            var publishResult = comparisonResult.GenerateScript(".");

            Console.WriteLine(publishResult.MasterScript);
            Console.WriteLine(publishResult.Script);
            Console.WriteLine(publishResult.Success ? "Publish succeeded." : "Publish failed.");
        }
        public async Task GivenTwoSchemaInitializationMethods_WhenCreatingTwoDatabases_BothSchemasShouldBeEquivalent()
        {
            // Create two databases, one where we apply the the maximum supported version's snapshot SQL schema file
            SqlDataStoreTestsFixture snapshotFixture = new SqlDataStoreTestsFixture(SqlDataStoreTestsFixture.GenerateDatabaseName("SNAPSHOT"));

            // And one where we apply .diff.sql files to upgrade the schema version to the maximum supported version.
            SqlDataStoreTestsFixture diffFixture = new SqlDataStoreTestsFixture(SqlDataStoreTestsFixture.GenerateDatabaseName("DIFF"));

            await snapshotFixture.InitializeAsync(forceIncrementalSchemaUpgrade : false);

            await diffFixture.InitializeAsync(forceIncrementalSchemaUpgrade : true);

            SchemaCompareDatabaseEndpoint snapshotEndpoint = new SchemaCompareDatabaseEndpoint(snapshotFixture.TestConnectionString);
            SchemaCompareDatabaseEndpoint diffEndpoint     = new SchemaCompareDatabaseEndpoint(diffFixture.TestConnectionString);
            var comparison = new SchemaComparison(snapshotEndpoint, diffEndpoint);
            SchemaComparisonResult result = comparison.Compare();

            // filter our sproc bodyscript differences because of auto-generation
            var actualDiffs = new List <SchemaDifference>();

            if (!result.IsEqual)
            {
                foreach (var diff in result.Differences)
                {
                    if (diff.Name == "SqlProcedure")
                    {
                        foreach (var childDiff in diff.Children)
                        {
                            if (childDiff.Name != "BodyScript")
                            {
                                actualDiffs.Add(diff);
                                break;
                            }
                        }
                    }
                    else
                    {
                        actualDiffs.Add(diff);
                    }
                }
            }

            Assert.Empty(actualDiffs);

            // cleanup if succeeds
            await snapshotFixture.DisposeAsync();

            await diffFixture.DisposeAsync();
        }
        /* Methods */

        /// <inheritdoc />
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            SchemaComparison comparison = value as SchemaComparison;

            if (comparison == null)
            {
                return(null);
            }

            return(new object[]
            {
                comparison.AddedTables,
                comparison.RemovedTables,
                comparison.ChangedTables,
                comparison.UnchangedTables
            });
        }
        public SchemaComparisonResult Compare(string compareFileLocation = null)
        {
            var compare = new SchemaComparison(_sourceDacPac, _enpointDb);

            compare.Options.BlockOnPossibleDataLoss = false;

            if (compareFileLocation != null)
            {
                compare.SaveToFile(compareFileLocation);
            }

            compare = new SchemaComparison(compareFileLocation);

            _compareResult = compare.Compare();

            return(_compareResult);
        }
        public bool CompareDatabaseSchemas(string databaseName1, string databaseName2)
        {
            var testConnectionString1 = new SqlConnectionStringBuilder(_initialConnectionString)
            {
                InitialCatalog = databaseName1
            }.ToString();
            var testConnectionString2 = new SqlConnectionStringBuilder(_initialConnectionString)
            {
                InitialCatalog = databaseName2
            }.ToString();

            var source     = new SchemaCompareDatabaseEndpoint(testConnectionString1);
            var target     = new SchemaCompareDatabaseEndpoint(testConnectionString2);
            var comparison = new SchemaComparison(source, target);
            SchemaComparisonResult result = comparison.Compare();

            return(result.IsEqual);
        }
Пример #21
0
        public void Compare()
        {
            var sourceConn = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Identity;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
            var targetConn = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=AspDataDb;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
            //string sourceDacFile = "";
            //string targetDacFile = "";
            string TargetDataBaseName = "";

            SourceEndPoint = GetEndPoint(sourceConn);
            TargetEndPoint = GetEndPoint(targetConn);



            var comparison   = new SchemaComparison(SourceEndPoint, TargetEndPoint);
            var result       = comparison.Compare();
            var differences  = result.GenerateScript(TargetDataBaseName);
            var changeScript = differences.Script;
        }
Пример #22
0
 private void btn_Apply_Click(object sender, RoutedEventArgs e)
 {
     MessageBox.Show(LaneDB);
     MessageBox.Show(StationDB);
     try
     {
         var    source      = new SchemaCompareDatabaseEndpoint(LaneDB);
         var    target      = new SchemaCompareDatabaseEndpoint(StationDB);
         var    comparison  = new SchemaComparison(source, target);
         var    result      = comparison.Compare();
         var    differences = result.GenerateScript("ITD_SyncMonitor");
         string script      = differences.Script;
     }
     catch
     {
         MessageBox.Show("Lỗi");
     }
 }
        public void Execute(TaskExecutionMode mode)
        {
            if (this.CancellationToken.IsCancellationRequested)
            {
                throw new OperationCanceledException(this.CancellationToken);
            }

            try
            {
                SchemaCompareEndpoint sourceEndpoint = CreateSchemaCompareEndpoint(this.Parameters.SourceEndpointInfo, this.SourceConnectionString);
                SchemaCompareEndpoint targetEndpoint = CreateSchemaCompareEndpoint(this.Parameters.TargetEndpointInfo, this.TargetConnectionString);

                SchemaComparison comparison = new SchemaComparison(sourceEndpoint, targetEndpoint);

                if (this.Parameters.DeploymentOptions != null)
                {
                    comparison.Options = this.CreateSchemaCompareOptions(this.Parameters.DeploymentOptions);
                }

                this.ComparisonResult = comparison.Compare();

                // try one more time if it didn't work the first time
                if (!this.ComparisonResult.IsValid)
                {
                    this.ComparisonResult = comparison.Compare();
                }

                this.Differences = new List <DiffEntry>();
                foreach (SchemaDifference difference in this.ComparisonResult.Differences)
                {
                    DiffEntry diffEntry = CreateDiffEntry(difference, null);
                    this.Differences.Add(diffEntry);
                }
            }
            catch (Exception e)
            {
                ErrorMessage = e.Message;
                Logger.Write(TraceEventType.Error, string.Format("Schema compare operation {0} failed with exception {1}", this.OperationId, e.Message));
                throw;
            }
        }
Пример #24
0
        public bool CompareDatabaseSchemas(string databaseName1, string databaseName2)
        {
            var testConnectionString1 = new SqlConnectionStringBuilder(_initialConnectionString)
            {
                InitialCatalog = databaseName1
            }.ToString();
            var testConnectionString2 = new SqlConnectionStringBuilder(_initialConnectionString)
            {
                InitialCatalog = databaseName2
            }.ToString();

            var source     = new SchemaCompareDatabaseEndpoint(testConnectionString1);
            var target     = new SchemaCompareDatabaseEndpoint(testConnectionString2);
            var comparison = new SchemaComparison(source, target);

            SchemaComparisonResult result = comparison.Compare();

            // These types were introduced in earlier schema versions but are no longer used in newer versions.
            // They are not removed so as to no break compatibility with instances requiring an older schema version.
            // Exclude them from the schema comparison differences.
            (string type, string name)[] deprecatedObjectToIgnore =
Пример #25
0
        private static void Main(string[] args)
        {
            try
            {
                if ((args?.Length ?? 0) == 0)
                {
                    Console.WriteLine("A folder name (usually a solution folder) is required to run this command.");
                    return;
                }

                var assembly = Assembly.GetExecutingAssembly();
                Console.WriteLine($"Postulate.Merge.SqlServer version {assembly.GetName().Version}");

                const string settingsFilename = "Postulate.Merge.json";
                string       path             = args[0];
                string       settingsFile     = Path.Combine(path, settingsFilename);

                if (!File.Exists(settingsFile))
                {
                    CreateEmptySettingsFile(path, settingsFilename);
                    return;
                }

                var  settings = JsonFile.Load <Settings>(settingsFile);
                bool anyDiff  = false;

                while (true)
                {
                    Console.WriteLine($"Analyzing model classes in {Path.GetFileName(settings.SourceAssembly)}...");
                    var sourceDb = new PostulateDbProvider <SqlServerIntegrator>().GetDatabase(settings.SourceAssembly);

                    string connectionString = ResolveConnectionString(settings, path);
                    var    targetProvider   = new SqlServerDbProvider();

                    var connectionInfo = ConnectionStrings.Parse(connectionString);
                    Console.WriteLine($"Analyzing target database {connectionInfo.TryGetValues("Data Source", "Database")}...");
                    var targetDb = targetProvider.GetDatabaseAsync(connectionString).Result;

                    var syntax = targetProvider.GetDefaultSyntax();

                    Console.WriteLine("Looking for differences...");
                    Console.WriteLine();

                    var diff = SchemaComparison.Execute(sourceDb, targetDb, settings.ExcludeObjects);
                    if (diff.AnyDifferences())
                    {
                        anyDiff = true;
                        StringBuilder script   = new StringBuilder();
                        var           commands = diff.GetScriptCommands(syntax);
                        foreach (var cmd in commands)
                        {
                            script.AppendLine(cmd);
                        }

                        Console.WriteLine(script.ToString());

                        Console.WriteLine("Press Enter to execute, E to edit, T to save test case, or Escape to cancel:");
                        var response = Console.ReadKey();
                        switch (response.Key)
                        {
                        case ConsoleKey.Escape:
                            return;

                        case ConsoleKey.Enter:
                            Console.WriteLine("Executing script...");
                            var scriptRunner = new SqlScriptRunner(targetProvider);
                            scriptRunner.Run(connectionString, script.ToString());
                            break;

                        case ConsoleKey.E:
                            Console.WriteLine($"Starting {Path.GetFileName(settings.CommandExe)}...");
                            string scriptFile = Path.Combine(path, "Postulate.Merge.sql");
                            if (File.Exists(scriptFile))
                            {
                                File.Delete(scriptFile);
                            }
                            diff.SaveScript(syntax, scriptFile);
                            EditScript(scriptFile, settings, connectionString);
                            return;

                        case ConsoleKey.T:
                            string testCaseFile = Path.Combine(path, "Postulate.TestCase.json");
                            if (File.Exists(testCaseFile))
                            {
                                File.Delete(testCaseFile);
                            }
                            diff.SaveTestCase(testCaseFile);
                            Console.WriteLine($"Test case file {testCaseFile} was created. If you raise an issue on the SchemaSync repository (https://github.com/adamosoftware/SchemaSync), please attach the test case if appropriate.");
                            Console.ReadLine();
                            return;
                        }
                    }
                    else
                    {
                        Console.WriteLine($"No {((anyDiff) ? "more " : string.Empty)}differences found.");
                        Console.ReadLine();
                        break;
                    }
                }
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.Message);
                Console.ReadLine();
            }
        }
Пример #26
0
        private void Start()
        {
            var src    = new SqlConnectionStringBuilder(this.SourceConString);
            var target = new SqlConnectionStringBuilder(this.TargetConString);


            //if Bac file not exists create new
            //var bacPacFile = Path.Combine(GetWorkingFolder(), src.InitialCatalog + ".dacpac");
            //var dacService = new Microsoft.SqlServer.Dac.DacServices(this.SourceConString);
            //dacService.Extract(bacPacFile, src.InitialCatalog, "Test Application", Version.Parse(AppVersion));

            //var sourceDacpac = new SchemaCompareDacpacEndpoint(bacPacFile);
            Console.WriteLine("Creating Database end point connections.");
            var sourceEndPoint = new SchemaCompareDatabaseEndpoint(this.SourceConString);

            var targetEndPoint = new SchemaCompareDatabaseEndpoint(this.TargetConString);


            Console.WriteLine("Initializing Schema Comparision with given endpoints");
            var comparison = new SchemaComparison(sourceEndPoint, targetEndPoint);

            //// Persist comparison file to disk in Schema Compare (.scmp) format
            //var scmpFile = GetDacFileName(src.ConnectionString) + ".scmp";
            //comparison.SaveToFile(scmpFile);
            //// Load comparison from Schema Compare (.scmp) file
            //comparison = new SchemaComparison(scmpFile);
            Console.WriteLine("Schema Comparision Setting Options...");
            comparison.Options = new Microsoft.SqlServer.Dac.DacDeployOptions()
            {
            };
            if (Program.CommandArgs.ContainsKey("excludedTypes"))
            {
                var stringSplitter = new string[] { ",", ";", "|" };
                var excludedTypes  = new List <Microsoft.SqlServer.Dac.ObjectType>();
                foreach (var type in Program.CommandArgs["excludedTypes"].ToString().Split(stringSplitter, StringSplitOptions.RemoveEmptyEntries))
                {
                    Microsoft.SqlServer.Dac.ObjectType outType;
                    if (Enum.TryParse(type, out outType))
                    {
                        Console.WriteLine("   Adding excluded type {0}", outType.ToString());
                        excludedTypes.Add(outType);
                    }
                }
                comparison.Options.ExcludeObjectTypes = excludedTypes.ToArray();
            }
            Console.WriteLine("Schema Comparision Starting...");
            //Set Options

            SchemaComparisonResult comparisonResult = comparison.Compare();

            Console.WriteLine("Schema Comparision Compated.");
            var sourceFolder = GetSourceWorkingFolder(this.SourceConString);
            var targetFolder = GetSourceWorkingFolder(this.TargetConString);

            Console.WriteLine("Creating diff object scripts...");
            foreach (var d in comparisonResult.Differences)
            {
                string objectName = string.Join(".", d.SourceObject?.Name.Parts ?? d.TargetObject.Name.Parts);
                string objType    = d.SourceObject?.ObjectType?.Name ?? d.TargetObject?.ObjectType?.Name;
                if (string.IsNullOrWhiteSpace(objectName))
                {
                    Console.WriteLine("Object Name is empty {0}", objectName);
                    continue;
                }
                WriteToFile(sourceFolder, objType, objectName, d.SourceObject?.ToString());

                WriteToFile(targetFolder, objType, objectName, d.TargetObject?.GetScript());
            }

            // Find the change to table1 and exclude it.
            //foreach (SchemaDifference difference in comparisonResult.Differences)
            //{
            //    if (difference.TargetObject.Name != null &&
            //        difference.TargetObject.Name.HasName &&
            //        difference.TargetObject.Name.Parts[1] == "DbConnections")
            //    {
            //        comparisonResult.Exclude(difference);
            //        break;
            //    }
            //}


            // Publish the changes to the target database
            //SchemaComparePublishResult publishResult = comparisonResult.PublishChangesToTarget();
            var publishResult = comparisonResult.GenerateScript(target.InitialCatalog);

            WriteToFile(GetWorkingFolder(), "", "MasterChangeScript.sql", publishResult.MasterScript);
            WriteToFile(GetWorkingFolder(), "", "ChangeScript.sql", publishResult.Script);

            Console.WriteLine(publishResult.Success ? "Publish succeeded." : "Publish failed.");

            System.IO.Compression.ZipFile.CreateFromDirectory(GetWorkingFolder(), Path.Combine(_basePath, "Artifact" + DateTime.Now.ToString("ddMMMyyHHmmss") + ".zip"));
        }
Пример #27
0
        public SchemaComparisonResult Compare()
        {
            SchemaComparisonResult = SchemaComparison.Compare();

            return(SchemaComparisonResult);
        }