由于缺少对象,DACPAC 无法部署

Posted

技术标签:

【中文标题】由于缺少对象,DACPAC 无法部署【英文标题】:DACPAC fails to deploy due to missing object 【发布时间】:2021-12-19 01:26:12 【问题描述】:

我有一个复杂数据库的 DACPAC,我试图通过 Azure DevOps Pipeline 中的 Powershell 进行部署。

我通过 Sqlpackage.exe 运行它

& $(sqlPackage) "/Action:Publish" "/TargetServerName:$(myserver)" /TargetDatabaseName:"(myDB)" "/p:CreateNewDatabase=True" "/TargetUser:$(myUser)" "/TargetPassword:$(myPass)"  "/SourceFile:$(myDacpac)" "/p:IgnoreUserSettingsObjects=True" "/p:IgnoreAuthorizer=True" "/p:VerifyDeployment=True" "/p:ExcludeObjectTypes=Logins;Aggregates" "/p:IncludeTransactionalScripts=True"

查看我的日志文件,我发现我的 [missingobject] 正在创建中:

2021-11-04T17:52:30.6001273Z Creating [missingobject]...

然后很多步骤之后我得到这个错误:

Error SQL72014: .Net SqlClient Data Provider: Msg 208, Level 16, State 103, Procedure MY_VIEW, Line 20 Invalid object name 'myschema.[missingobject]'.
Error SQL72045: Script execution error.  The executed script:
CREATE VIEW myschema.MY_VIEW

缺少的对象是在同名 CLR 程序集中定义的聚合函数。我可以看到 CLR 程序集存在于数据库的 Assemblies 文件夹中。但实际的聚合函数并不存在。

似乎 dacpac 正在部署程序集,然后是视图。但是函数应该在视图之前。

在网上看,我看到 sql server “智能地”确定依赖关系并以正确的顺序部署,但这里似乎没有发生。

【问题讨论】:

【参考方案1】:

SQLPROJ 和 dacpac 必须同时包含:程序集 CREATE AGGREGATE/FUNCTION 脚本。

同名CLR程序集

这意味着唯一的Creating [missingobject] 代表程序集。

而且您的 sqlpackage 参数 /p:ExcludeObjectTypes=Logins;Aggregates 不会为任何聚合留下机会。从中删除Aggregates

【讨论】:

以上是关于由于缺少对象,DACPAC 无法部署的主要内容,如果未能解决你的问题,请参考以下文章

API Facebook 营销错误:不支持的获取请求。 ID 为 XXXXXX 的对象不存在,由于缺少权限而无法加载

由于缺少文件,无法部署适配器

无法连接到 OpenOffice Base - 用户缺少权限或找不到对象异常

旧版本的参考 Office 对象库...缺少 mso.dll

JSON 解析错误:缺少对象成员的名称

JSON 消息对象缺少 id 属性