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安全性的对象:
CREATE ASSEMBLY ... FROM 0x...;CREATE CERTIFICATE ... FROM BINARY = 0x...;选项#1不再是一种选择,至少不是它本身.选项2很好,但由于证书未完全集成到Visual Studio/MSBuild构建过程中,因此从未优先使用.
幸运的是,有两种方法可以解决这个问题,正如我在以下两篇博文中所讨论的那样:
只是回答了"为什么"你处于当前情况的问题.要解决这种情况,假设您可能不会更新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部分:"受信任程序集" - 失望
tSQLt 程序集已签名。目前,您可以在 master 中创建程序集,从中创建证书,再次删除程序集,然后使用该证书执行必要的步骤。
我正在努力获取在 2017 年自动安装 tSQLt 所需的步骤。
| 归档时间: |
|
| 查看次数: |
6284 次 |
| 最近记录: |