【问题标题】:SSDT Prevent Synonym Dropping on PublishSSDT 防止在发布时删除同义词
【发布时间】:2020-07-09 13:21:41
【问题描述】:

背景

我们正在使用面向 SQL Server 2012 的 SQL Server Data Tools(SQL 项目),它使用 DACPAC 发布到我们的不同环境。

问题

每当我们发布 SSDT 时,都会根据生成的发布脚本删除并重新创建同义词。我们希望防止这种情况发生,因为我们有一个存储过程负责为每个环境设置正确的同义词目标。

GO
PRINT N'Dropping [dbo].[MY_SYNONYM]...';
GO
DROP SYNONYM [dbo].[MY_SYNONYM];
GO
PRINT N'Creating [dbo].[MY_SYNONYM]...';
GO
CREATE SYNONYM [dbo].[MY_SYNONYM] FOR [MY_DEFAULT_TARGET];

我尝试将同义词的构建操作设置为 Build 以外的任何其他内容,但这会导致编译器出现问题并导致构建不成功。

我们的主要目标是防止为未更改目标的同义词重新创建同义词。我们知道我们可以通过利用sys.synonyms 进行比较来处理我们的存储过程。任何帮助表示赞赏,谢谢。

编辑:

我可以在高级发布设置上看到 ff,但我们不想启用 Drop objects in target but not in source。我们希望项目中的同义词在发布期间不会被重新创建。

【问题讨论】:

  • 您是否尝试过SqlPackage.exe /a:publish ... /p:DoNotDropObjectType=SynonymsSqlPackage.exe /a:publish ... /p:ExcludeObjectType=Synonyms 来查看是否会更改生成的部署脚本? (SqlPackage documentation)
  • @BillJetzer 我会调查的。在 Visual Studio 中是否有 /p:DoNotDropObjectType=Synonyms 的等效配置?我一直在摆弄配置,除了在目标数据库中找到但不在项目中的对象外,没有找到任何配置,为此我可以配置不删除哪些对象,但如果它不存在,我必须启用删除首先在项目中,这不是我们想要的。
  • 如果您在项目和数据库之间进行架构比较怎么办?单击齿轮,然后翻转到对象类型选项卡并取消选中同义词,然后单击“比较”,然后单击“生成脚本”
  • @BillJetzer /p:ExcludeObjectType=Synonyms 工作,在Advanced Publish Settings > ignore 下找到它。有了这个,我可以继续更改我们的 SP,它使用正确的底层对象创建同义词。随意发布它作为这个问题的答案。
  • 确保数据库属性与项目高级属性中设置的相同。尝试将它们全部对齐。

标签: sql-server sql-server-2012 sql-server-data-tools


【解决方案1】:

感谢@Bill Jetzer 的推荐,我能够在发布配置文件中找到 ff:

如果我们想使用命令行执行此操作,显然有SqlPackage 的选项/p:ExcludeObjectType=Synonyms

勾选排除同义词后,在发布配置文件中添加了以下行:

<PropertyGroup>
    ...
    <ExcludeSynonyms>True</ExcludeSynonyms>
</PropertyGroup>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2017-03-08
    相关资源
    最近更新 更多