首页 > 解决方案 > SSDT - 排除某些模式以及未命名的约束

问题描述

任务

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

问题

  1. 3rd 方模式对象(表)在创建表时使用未命名的约束(默认/主键)定义。例子:
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 on 3rd 方模式的行?- 即使 dll 不包括 3rd 方模式,它仍然有这些未命名的约束脚本/部署。此外,它也不会将它们添加回来!
  2. 我如何能够跳过/删除在 3rd 方模式上生成 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

标签: sql-serversql-server-data-toolssqlpackage

解决方案


关于未命名的约束,我找不到使用 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"

您可以在此处找到更多信息: 在 SQL 比较中处理系统命名的约束


推荐阅读