【发布时间】:2020-09-28 21:17:28
【问题描述】:
任务:
- 自动化数据库部署(使用 CI/CD 部署 SSDT/dacpac)
- 数据库是第 3 方数据库
- 它还包括我们自己在不同架构中自定义的表/SP/Fn/视图
- 在将数据库项目 (dacpac) 部署到生产环境时应排除第 3 方对象
- 感谢 Ed Elliott 提供AgileSqlClub.DeploymentFilterContributor。使用 dll 成功过滤掉架构。
问题:
- 第 3 方架构对象(表)在创建表时使用未命名的约束(默认/主键)定义。示例:
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 在第 3 方架构上的行? - 即使 dll 不包括 3rd 方模式,它仍然有这些未命名的约束脚本/部署。此外,它也不会将它们添加回来!
- 如何能够跳过/删除在第 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