无法在SQL Server 2017中创建tSQLtCLR程序集

Bre*_*ent 7 sql-server automated-tests sqlclr tsqlt sql-server-2017

我最近安装了SQL Server 2017 Express和localdb(一般可用性).在尝试安装tSQLt框架时,我发现了SQL Server 2017中实现的新安全功能:"clr strict security"选项.这个新的安全功能似乎阻止了tSQLtCLR程序集的创建.SQL错误消息指出:

使用SAFE或EXTERNAL_ACCESS选项对程序集'tSQLtCLR'进行CREATE或ALTER ASSEMBLY失败,因为sp_configure的'clr strict security'选项设置为1. Microsoft建议您使用具有相应登录名的证书或非对称密钥对程序集进行签名UNSAFE ASSEMBLY许可.或者,您可以使用sp_add_trusted_assembly信任程序集.

我已经阅读了与sp_add_trusted_assembly过程相关的Microsoft技术文档,但它似乎假设您能够成功创建程序集.如果你不能首先创建它,那么如何将tSQLtCLR程序集编码为"受信任"?

Sol*_*zky 12

SQL Server 2017引入了一个名为"CLR严格安全性"的新服务器级配置选项,默认情况下已启用.此选项要求使用证书或强名称密钥对所有程序集(甚至SAFE是所有程序集)进行签名,并且将用于执行该签名的证书或非对称密钥加载到其中[master],并从中创建登录,并且已授予该登录名该UNSAFE ASSEMBLY许可.

由于程序集SAFE现在需要加载之前具有基于签名的登录CREATE ASSEMBLY,因此不再可能有一个空的,已签名的程序集被加载到[master]via中CREATE ASSEMBLY ... FROM 0x... WITH PERMISSION_SET = SAFE;.

现在,只有两种方法可以创建可用于从VARBINARY文字或变量(即不是来自外部文件)设置SQLCLR安全性的对象:

  1. CREATE ASSEMBLY ... FROM 0x...;
  2. CREATE CERTIFICATE ... FROM BINARY = 0x...;

选项#1不再是一种选择,至少不是它本身.选项2很好,但由于证书未完全集成到Visual Studio/MSBuild构建过程中,因此从未优先使用.

幸运的是,有两种方法可以解决这个问题,正如我在以下两篇博文中所讨论的那样:

  1. SQLCLR与SQL Server 2017,第2部分:"CLR严格安全性" - 解决方案1 - 比第3部分,解决方案2(下面)更多的步骤,但非常适合现有项目,因为它几乎不需要对现有解决方案进行任何更改甚至部署过程(事实上,这实际上是我为我的SQL#项目所做的路线,因为它只是在安装脚本的开头添加了3个简单的步骤)
  2. SQLCLR与SQL Server 2017,第3部分:"CLR严格安全性" - 解决方案2

然而,

只是回答了"为什么"你处于当前情况的问题.要解决这种情况,假设您可能不会更新tSQLt构建过程以包含证书,那么您可以做一个简单的事情一次性修复:

ALTER DATABASE [master] SET TRUSTWORTHY ON;
EXEC tSQLt.InstallExternalAccessKey;
EXEC master.sys.sp_executesql N'GRANT UNSAFE ASSEMBLY TO [tSQLtExternalAccessKey];';
ALTER DATABASE [master] SET TRUSTWORTHY OFF;
Run Code Online (Sandbox Code Playgroud)

GRANT UNSAFE ASSEMBLY是有由于tSQLt.InstallExternalAccessKey存储过程只授予EXTERNAL ACCESS ASSEMBLY给登录,这曾经是罚款,但现在是远远不够的.

当然,在完成这4个步骤之前,您将无法加载tSQLt程序集,因此如果该过程首先加载所有内容并且失败,那么您将需要执行以下操作:

EXEC sp_configure 'clr strict security', 0; RECONFIGURE;
-- Install tSQLt ...
EXEC tSQLt.InstallExternalAccessKey;
EXEC master.sys.sp_executesql N'GRANT UNSAFE ASSEMBLY TO [tSQLtExternalAccessKey];';
EXEC sp_configure 'clr strict security', 1; RECONFIGURE;
Run Code Online (Sandbox Code Playgroud)

我在tSQLt GitHub存储库中创建了一个问题,其中的步骤需要将理想的修复程序合并到源文件中:https://github.com/tSQLt-org/tSQLt/issues/25

请注意

这些可能的解决方案都不包括使用新的"可信装配"功能.任何人都不应该以任何理由(除了好奇心和测试之外)使用该功能.避免它的原因在几个博客文章中详细介绍(目前有3个或更多),首先是:

SQLCLR与SQL Server 2017,第4部分:"受信任程序集" - 失望


Seb*_*ine 5

tSQLt 程序集已签名。目前,您可以在 master 中创建程序集,从中创建证书,再次删除程序集,然后使用该证书执行必要的步骤。

我正在努力获取在 2017 年自动安装 tSQLt 所需的步骤。