我正在使用 SSDT 创建一个包含 CLR 用户定义聚合的数据库。
聚合旨在位于不同的模式中。如果不使用部署后脚本在部署后移动对象,SSDT 中的 CLR 对象就不可能做到这一点。
我正在尝试做的是:
- 使用“默认模式”选项在单个模式(“CLR”模式)中创建 CLR 聚合
- 在所需架构中使用 CREATE AGGREGATE 包装器来调用 CLR 聚合
例如,我有一个 CLR 聚合,例如:
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize = -1)]
public struct StatsEntropy : IBinarySerialize
{
... etc
}
这被编译并成为数据库中的 CLR.StatsEntropy。该数据库称为 AnalysisFunctions,因此它有一个也称为 AnalysisFunctions 的程序集。这没有问题。
然后我在 Stats 模式中创建一个包装器,如下所示:
CREATE AGGREGATE [Stats].[Entropy]
(
@Values FLOAT
)
RETURNS FLOAT
EXTERNAL NAME AnalysisFunctions.StatsEntropy
当我通过调试构建时,这可以正常工作。我将调试连接设置为 SQL Server 的命名实例。如果我按 F5,它将毫无问题地编译和部署。该代码现在可以在服务器上使用,包括包装器。
但是,如果我尝试使用 Publish 发布到服务器,它就不起作用。相反,它失败了:
对目标数据库建模时发生错误。部署无法继续。
数据工具操作面板或错误列表中没有更多错误消息。ssdttrace 没有显示有用的信息:
这只发生在数据库已经存在于服务器上时。如果我删除数据库,它可以成功部署。即使数据库已经存在,我也可以通过调试成功部署,只有通过发布才会出现问题。直到我添加了聚合包装器,我才开始遇到这个问题。
以前我也收到错误,表明由于使用外部名称,程序集 AnalysisFunctions 有一个未解析的引用 - 再次通过调试工作,而不是通过发布工作。但现在这个错误已经神秘地消失了。
我正在使用 Visual Studio 2017 15.9.21 和 SSDT 15.1.62002.01090,部署到 SQL Server 2019。
有谁知道这个错误可能是什么,或者我如何调试它?
我无法使用与您相同版本的 SSDT 重现此问题。我确实有一个稍新的 Visual Studio (15.9.24),但如果这很重要,我会感到惊讶。这是我的(非常小的)设置,如果我误解了您的场景的某些部分,请告诉我:
SSDT项目
clr.sql
统计.sql
统计熵.cs
默认架构
通常,预览生成期间的失败表明目标数据库中存在 SSDT 模型 (dacpac) 中不存在的对象。此处在 Stack Overflow 上对此进行了讨论:SSDT Publish errors on Creating Publish Preview
您可以使用“架构比较”功能来检查是否适合您。
如果目标中没有冲突的对象,那么如果您可以编辑您的问题以包含您的发布设置(“.publish.xml”文件,或至少发布时“高级”窗口的屏幕截图),将会很有帮助。可能是一些奇怪的选项组合导致了问题。