在 SSDT Schema 比较中,我如何忽略“Schema”类型的对象的差异

Posted

技术标签:

【中文标题】在 SSDT Schema 比较中,我如何忽略“Schema”类型的对象的差异【英文标题】:In SSDT Schema Compare how do I ignore differences in objects of type "Schema" 【发布时间】:2013-07-16 14:08:40 【问题描述】:

从架构比较选项中,我取消选择所有对象类型:

它仍然向我展示了 Schema 对象的差异:

我滚动浏览了常规选项的大列表,但似乎都没有这样做:

【问题讨论】:

实际的区别是什么?如果您编写更改脚本,那么在这些模式中会进行哪些更改?权限?角色?其他?在这种情况下,模式可能不在您的项目中,因此它试图删除它们。将它们添加到项目中或选择不删除不在项目中的项目,您可能会取得一些成功。 他们不在我的项目中,我不希望他们成为其中的一部分。我想删除其他对象类型,例如存储过程。我只想忽略模式对象,就像我忽略登录一样。它似乎是我不能忽略的唯一对象类型。当我进行发布时,这不是问题,因为我可以成功地忽略它。 问题是 Schema 在生产和开发中具有不同的 AUTHORIZATION [user]。当我进行发布时,当我选择要发布的架构中的一些存储过程时,架构会自动检查(灰色复选标记)。 :(((我没有找到解决这个问题的方法,不得不手动发布部分内容。 【参考方案1】:

我破解了它。如果保存比较,可以将其添加到文件中:

  <PropertyElementName>
    <Name>Microsoft.Data.Tools.Schema.Sql.SchemaModel.SqlSchema</Name>
    <Value>ExcludedType</Value>
  </PropertyElementName>

你会看到打开它的位置。此设置不在 UI 中,但显然受支持。

【讨论】:

就我而言,这不起作用。保存它实际上会排除更多的东西,而不仅仅是排除架构。 +1 @Kyopaxa 提到的内容 - 我已将此选项添加到我的 SCMP 文件中,但它也掩盖了许多其他差异。我相信它可能与这个 Microsoft Connect 问题有关:connect.microsoft.com/VisualStudio/feedback/details/794077/… 这会排除所有更改,即使来自其他架构。它不起作用。【参考方案2】:

在进行模式合并之前,您可以通过将以下内容作为 exe 运行来在代码中设置排除模式。下面的代码需要将 Microsoft.SqlServer.DacFx nuget 包添加到您的项目中。它需要 2 个参数,一个是 .scmp 文件路径,第二个是逗号分隔的要排除的模式字符串。它将覆盖提供的 .scmp 并排除您提供的模式名称。

它本质上是在 .scmp 文件中添加 XML 部分,这相当于取消选中 UI 上的对象并保存文件。 (持续偏好)

如果您希望在部署期间不合并一个架构,则此 exe 执行可以是您的 VSTS (VSO) 发布管道中的一项任务。

using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.SqlServer.Dac.Compare;

namespace DatabaseSchemaMergeHelper

    /// <summary>
    /// Iterates through a supplied schema compare file and excludes objects belonging to a supplied list of schema
    /// </summary>
    class Program
    
        /// <summary>
        /// first argument is the scmp file to update, second argument is comma separated list of schemas to exclude
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        
            if (args.Length == 0) return;

            var scmpFilePath = args[0];
            var listOfSchemasToExclude = args[1].Split(',').ToList();

            // load comparison from Schema Compare (.scmp) file
            var comparison = new SchemaComparison(scmpFilePath);
            var comparisonResult = comparison.Compare();

            // find changes pertaining to objects belonging to the supplied schema exclusion list
            var listOfDifferencesToExclude = new List<SchemaDifference>();

            // add those objects to a list
            foreach (SchemaDifference difference in comparisonResult.Differences)
            
                if (difference.TargetObject != null &&
                    difference.TargetObject.Name != null &&
                    difference.TargetObject.Name.HasName &&
                    listOfSchemasToExclude.Contains(difference.TargetObject.Name.Parts[0], StringComparer.OrdinalIgnoreCase))
                
                    listOfDifferencesToExclude.Add(difference);
                
            

            // add the needed exclusions to the .scmp file
            foreach (var diff in listOfDifferencesToExclude)
            
                if (diff.SourceObject != null)
                
                    var SourceExclusionObject = new SchemaComparisonExcludedObjectId(diff.SourceObject.ObjectType, diff.SourceObject.Name,
                                                                                     diff.Parent?.SourceObject.ObjectType, diff.Parent?.SourceObject.Name);
                    comparison.ExcludedSourceObjects.Add(SourceExclusionObject);
                

                var TargetExclusionObject = new SchemaComparisonExcludedObjectId(diff.TargetObject.ObjectType, diff.TargetObject.Name,
                                                                                 diff.Parent?.TargetObject.ObjectType, diff.Parent?.TargetObject.Name);
                comparison.ExcludedTargetObjects.Add(TargetExclusionObject);
            

            // save the file, overwrites the existing scmp.
            comparison.SaveToFile(scmpFilePath, true);
        
    

【讨论】:

【参考方案3】:

右键单击顶层节点(添加、更改、删​​除),您可以选择“全部排除”以取消选中该类型的所有元素。这至少会很快让你进入一个一切都没有被检查的状态。

【讨论】:

以上是关于在 SSDT Schema 比较中,我如何忽略“Schema”类型的对象的差异的主要内容,如果未能解决你的问题,请参考以下文章

SSDT Schema Compare 在模式文件中添加空行

SSDT/VS2015 数据库部署——发布忽略嵌套视图

SSDT Schema Compare 总是添加对象,在解决方案中是“Build = None”

忽略仅授予模式比较的差异

Visual Studio 2019 - SSDT

SQL Server 数据库项目比较架构忽略同一表中的字段序列