我正在使用 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。
有谁知道这个错误可能是什么,或者我如何调试它?