sql-server - SSDT - 排除某些模式以及未命名的约束
问题描述
任务:
- 自动化数据库部署(使用 CI/CD 部署 SSDT/dacpac)
- 该数据库是第 3 方数据库
- 它还包括我们自己定制的表/SP/Fn/Views 在单独的模式中
- 将数据库项目(dacpac)部署到生产时应排除第 3 方对象
- 感谢 Ed Elliott 的AgileSqlClub.DeploymentFilterContributor。使用 dll 成功过滤掉架构。
问题:
- 3rd 方模式对象(表)在创建表时使用未命名的约束(默认/主键)定义。例子:
CREATE TABLE [3rdParty].[MainTable]
(ID INT IDENTITY(1,1) NOT NULL,
CreateDate DATETIME DEFAULT(GETDATE())) --There is no name given to default constraint
- 当我使用 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];
- 由于公司限制,我无法更改第 3 方架构
- 脚本中生成了多行未命名约束和 WITH CHECK CHECK 约束。
问题:
- 我怎样才能删除DROP unnamed Constraint on 3rd 方模式的行?- 即使 dll 不包括 3rd 方模式,它仍然有这些未命名的约束脚本/部署。此外,它也不会将它们添加回来!
- 我如何能够跳过/删除在 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
解决方案
关于未命名的约束,我找不到使用 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 比较中处理系统命名的约束
推荐阅读
- mysql - 通过查询自动分配列
- c - 如何通过 FreeBSD 中的文件结构获取绝对路径?
- sql - 如何从多列中选择树
- ruby-on-rails - 如何在模型的两个深度关系中查询最终模型上的属性?
- php - 使用php比较提交和显示消息的复选框值
- android - Nestedscrollview/Scrollview 中的 Webview 缺少内容
- wordpress - 如何将转发器字段添加到个人资料表单 Ultimate 会员插件
- html - 创建一个运行 python http 服务器的 dockerfile 来显示一个 html 文件
- javascript - Fabricjs:显示横幅的预览
- mysql - 如何检查一个点是否在 MySQL 表的多边形内?