【发布时间】:2016-10-28 08:42:48
【问题描述】:
我正在尝试将一些 CLR 代码上传到 SQL Server 2016(开发人员版)实例。总的来说,结构是这样的:
- 一个 CLR UDF 依赖于程序集
A - 另一个 CLR UDF 依赖于程序集
B -
A和B都依赖于程序集C
.sqlproj 的目标框架是 4.0。程序集 A 和 B 是针对 .net4.0 构建的。程序集C 是针对 .net2.0 构建的。所有程序集都设置为Model Aware: True、Permission Set: Safe。所有程序集均未签名。
当我将 .sqlproj 发布到数据库服务器时,程序集 C 和 B 运行良好,但程序集 A 失败:
我花了大约一天时间研究这个主题,但没有找到任何有用的东西。因此,任何想法都将不胜感激。
更新1:设置所有程序集的Permission Set 属性并将数据库trustworthy 属性设置为ON 工作,程序集现在已成功部署。但是,现在我无法调用 UDF,因为它们不受信任 :) 我敢肯定,这是可以解决的,但这不是问题的真正解决方案。而且我仍然不明白为什么它不适用于Permission Set: Safe。
关于服务器和开发机器上的 .NET 版本。开发机器是 Win 10。SQL Server 在 WinServer 2012 R2 标准核心上的 VM 中运行。两者都安装了所有最新更新。服务器上安装的 .NET 版本是(使用这个 sn -p https://stackoverflow.com/a/3495491/664178):
PSChildName 版本发布产品 ----------- ------- ------- -------- 客户端 4.6.01055 394271 4.6.1 满 4.6.01055 394271 4.6.1 客户端 4.0.0.0在开发机器上:
PSChildName 版本发布产品 ----------- ------- ------- -------- v2.0.50727 2.0.50727.4927 v3.0 3.0.30729.4926 Windows 通信基础 3.0.4506.4926 Windows 演示基础 3.0.6920.4902 v3.5 3.5.30729.4926 客户端 4.6.01038 394254 4.6.1 满 4.6.01038 394254 4.6.1 客户端 4.0.0.0我似乎无法将开发机器上的 .NET 更新到与服务器相同的版本。可能是因为开发机器的 Windows 设置为延迟更新......但是这个版本不匹配会成为麻烦的根源吗?
更新 2: 显然,这些 .NET 版本是各自平台的最新版本 (https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx)
更新 3:我尝试了一些进一步的事情。
将数据库项目部署到本地 SQL Server 2016 Express 数据库会产生相同的结果,因此看起来开发和服务器盒上的 .NET 版本不匹配不是问题。
此外,在部署到 LocalDB v12.0(SQL Server 2014 引擎)时观察到完全相同的行为,因此问题可能不在于 SQL Server 2016 .
在 Windows Server (Install-WindowsFeature NET-Framework-Core) 上安装 .NET 3.5 也没有影响这种情况。
【问题讨论】:
-
程序集“A”使用什么
PERMISSION_SET?你的大会签署了吗?您是否尝试在 SQL Server 的早期版本上加载这些程序集 -
@srutzky 我在帖子中添加了此信息。所有程序集都是
PERMSSION_SET = SAFE,没有一个程序集签名。我无权访问 SQL Server 2014,所以我没有尝试。但我可能会开始准备一个带有 MSSQL2014 的 VM 来测试它。 -
好的。您能否测试将它们设置为
UNSAFE,虽然我不建议将其用于生产用途,但为了更快/更轻松的测试,请将数据库设置为TRUSTWORTHY = ON? -
另外,SQL Server 2016 实例是否在您的开发盒上运行?如果不是,它是否与您的开发盒处于同一级别的 .NET Framework 补丁?
-
@srutzky 用更多信息更新了问题!
标签: .net sql-server .net-assembly sqlclr sql-server-2016