【问题标题】:SSDT - Exclude certain schema along with unnamed constraintSSDT - 排除某些模式以及未命名的约束
【发布时间】:2020-09-28 21:17:28
【问题描述】:

任务

  1. 自动化数据库部署(使用 CI/CD 部署 SSDT/dacpac)
  2. 数据库是第 3 方数据库
  3. 它还包括我们自己在不同架构中自定义的表/SP/Fn/视图
  4. 在将数据库项目 (dacpac) 部署到生产环境时应排除第 3 方对象
  5. 感谢 Ed Elliott 提供AgileSqlClub.DeploymentFilterContributor。使用 dll 成功过滤掉架构。

问题

  1. 第 3 方架构对象(表)在创建表时使用未命名的约束(默认/主键)定义。示例:
CREATE TABLE [3rdParty].[MainTable] 
(ID INT IDENTITY(1,1) NOT NULL,
CreateDate DATETIME DEFAULT(GETDATE()))  --There is no name given to default constraint
  1. 当我使用 sqlpackage.exe 生成部署脚本时,我在生成的脚本中看到以下语句。

使用以下方法生成脚本:

    "C:\Program Files\Microsoft SQL Server\150\DAC\bin\sqlpackage.exe" /action:script /sourcefile:C:\Users\User123\source\repos\DBProject\DBProject\bin\Debug\DBProject.dacpac /TargetConnectionString:"Data Source=MyServer; Initial Catalog=MSSQLDatabase; Trusted_Connection=True" /p:AdditionalDeploymentContributorPaths="C:\Program Files\Microsoft SQL Server\150\DAC\bin\AgileSqlClub.SqlPackageFilter.dll" /p:AdditionalDeploymentContributors=AgileSqlClub.DeploymentFilterContributor /p:AdditionalDeploymentContributorArguments="SqlPackageFilter=IgnoreSchema(3rdParty)" /outputpath:"c:\temp\script_AfterDLL.sql"

脚本输出:

/*
Deployment script for MyDatabase

This code was generated by a tool.
Changes to this file may cause incorrect behavior and will be lost if
the code is regenerated.
*/
...
...
GO
PRINT N'Dropping unnamed constraint on [3rdParty].[MainTable]...';


GO
ALTER TABLE [3rdParty].[MainTable] DROP CONSTRAINT [DF__MainTabl__Crea__59463169];

...
...
...(towards the end of the script)
ALTER TABLE [3rdParty].[MainTable_2] WITH CHECK CHECK CONSTRAINT [fk_518_t_44_t_9];
  1. 由于公司限制,我无法更改第 3 方架构
  2. 脚本中生成了多行未命名的约束和WITH CHECK CHECK约束。

问题

  1. 我怎样才能删除 DROP unnamed Constraint 在第 3 方架构上的行? - 即使 dll 不包括 3rd 方模式,它仍然有这些未命名的约束脚本/部署。此外,它也不会将它们添加回来!
  2. 如何能够跳过/删除在第 3 方架构上生成 WITH CHECK CHECK CONSTRAINT

任何建议都会很有帮助。

编辑:

另外,我发现了另一个问题。由于Rows were detected. The schema update is terminating because data loss might occur,部署不会成功

输出:

/*
The column [3rdParty].[MainTable_1].[Col1] is being dropped, data loss could occur.

The column [3rdParty].[MainTable_1].[Col2] is being dropped, data loss could occur.

The column [3rdParty].[MainTable_1].[Col3] is being dropped, data loss could occur.

The column [3rdParty].[MainTable_1].[Col4] is being dropped, data loss could occur.
*/

IF EXISTS (select top 1 1 from [3rdParty].[MainTable_1])
    RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127) WITH NOWAIT

GO

【问题讨论】:

  • 基本上,它以 Github 代码 https://github.com/GoEddie/DeploymentContributorFilterer 结束。由于我不是 .net 专家,因此将在 GitHub 中创建一个新问题。
  • “可能发生数据丢失”问题可以通过在发布配置文件中启用“允许数据丢失”选项来解决。对于未命名的约束,它也应该正常工作。正如您所说,它只是下降,那么您的项目或您的发布配置文件有问题。
  • 我所做的是添加一个自定义脚本(预部署脚本)将任何未命名的约束重命名为命名约束)!!
  • 但是你改变架构然后......

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


【解决方案1】:

关于未命名的约束,我找不到使用 sqlpackage.exe 的任何解决方案。 但是 Redgate SQL Compare 有一个忽略它们的选项,称为 IgnoreSystemNamedConstraintAndIndexNames,它会忽略系统生成的约束并生成更清晰的脚本。

例如比较 2 个 dacpacs 时:

SQLCompare /Scripts1:"\unpacked_dacpac_source_folder" /Scripts2:"\unpacked_dacpac_dest_folder" /options:IgnoreSystemNamedConstraintAndIndexNames  /scriptFile:"script_result.sql"

您可以在此处找到更多信息: Handling System-named Constraints in SQL Compare

【讨论】:

  • 这是一个付费产品,不是 AgileSqlClub.DeploymentFilterContributor 问题的答案。
猜你喜欢
  • 2010-10-14
  • 2011-08-20
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 2013-08-22
相关资源
最近更新 更多