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

2024-04-20

我最近安装了 SQL Server 2017 Express 和 localdb(正式版)。在尝试安装 tSQLt 框架时,我发现了 SQL Server 2017 中实现的一项新安全功能:“clr strict security”选项。这个新的安全功能似乎可以阻止创建 tSQLtCLR 程序集。

SQL 错误消息指出:

使用 SAFE 或 SAFE 创建或更改程序集“tSQLtCLR” EXTERNAL_ACCESS 选项失败,因为“clr strict security”选项 sp_configure 设置为 1。Microsoft 建议您签署 具有相应证书或非对称密钥的程序集 使用 UNSAFE ASSEMBLY 权限登录。或者,您可以信任 使用 sp_add_trusted_ assembly 的程序集。

我已阅读与 sp_add_trusted_assemble 过程相关的 Microsoft 技术文档,但似乎假设您能够成功创建程序集。如果您一开始就无法创建 tSQLtCLR 程序集,那么如何将其编码为“受信任”?


SQL Server 2017 引入了一个名为“CLR strict security”的新服务器级配置选项,并且默认情况下处于启用状态。此选项要求ALL组件,甚至SAFE,使用证书或强名称密钥进行签名,并且用于执行该签名的证书或非对称密钥加载到[master],并从中创建了一个登录名,并且该登录名已被授予UNSAFE ASSEMBLY允许。

Due to SAFE程序集现在需要基于签名的登录before正在通过加载CREATE ASSEMBLY,不再可能将空的、已签名的程序集加载到[master] via CREATE ASSEMBLY ... FROM 0x... WITH PERMISSION_SET = SAFE;.

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

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

选项#1 不再是一个选项,至少它本身不再是一个选项。选项 2 很好,但由于证书未完全集成到 Visual Studio / MSBuild 构建过程中,因此从未成为首选。

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

  1. SQLCLR 与 SQL Server 2017,第 2 部分:“CLR 严格安全性” – 解决方案 1 https://sqlquantumleap.com/2017/08/09/sqlclr-vs-sql-server-2017-part-2-clr-strict-security-solution-1/— 比第 3 部分解决方案 2(如下)的步骤更多,但非常适合现有项目,因为它几乎不需要对现有解决方案甚至部署过程进行任何更改(事实上,这实际上是我的路线)SQL# https://SQLsharp.com/?ref=so_46693088项目所做的只是在安装脚本的开头添加 3 个简单的步骤)
  2. SQLCLR 与 SQL Server 2017,第 3 部分:“CLR 严格安全性” – 解决方案 2 https://sqlquantumleap.com/2017/08/16/sqlclr-vs-sql-server-2017-part-3-clr-strict-security-solution-2/

HOWEVER,

这只是回答了“为什么”您处于当前所处情况的问题。要解决这种情况,假设您可能不会更新 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;

The 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;

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

请注意

这些可能的解决方案都不包括使用新的“受信任的程序集”功能。任何人都不应该以任何理由使用该功能(除了纯粹的好奇心和测试之外)。避免使用它的原因在几篇博客文章中都有详细介绍(目前有 3 篇甚至更多),开头是:

SQLCLR 与 SQL Server 2017,第 4 部分:“受信任的程序集”——令人失望的地方 https://sqlquantumleap.com/2017/08/28/sqlclr-vs-sql-server-2017-part-4-trusted-assemblies-the-disappointment/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 SQL Server 2017 中创建 tSQLtCLR 程序集 的相关文章

  • SQL查询多行变成单行

    有什么方法可以将通常返回具有相同值的多行的 SQL 查询更改为单行吗 例如 如果我现有的查询返回以下内容 ColA ColB 1 AA 1 BB 1 CC 2 AA 3 AA 我可以将查询更改为仅返回 3 行 并将 1 的第二个和第三个结果
  • SQL 解析键值字符串

    我有一个像这样的逗号分隔字符串 key1 value1 key2 value2 key3 value3 key1 value1 1 key2 value2 1 key3 value3 1 我想将它解析成一个如下所示的表 Key1 Key2
  • C# 事务中的事务

    我正在使用 C 将发票的平面文件导入到数据库中 如果遇到问题 我将使用 TransactionScope 回滚整个操作 这是一个棘手的输入文件 因为一行不一定等于一条记录 它还包括链接记录 发票将包含标题行 行项目和总计行 有些发票需要跳过
  • SQL Server、ISABOUT、加权项

    我试图弄清楚加权项在 SQL SERVER 的 ISABOUT 查询中是如何工作的 这是我目前所在的位置 每个查询返回以下行 查询 1 权重 1 初始排名 SELECT FROM CONTAINSTABLE documentParts ti
  • 动态SQL生成列名?

    我有一个查询 我正在尝试将行值转换为列名称 目前我正在使用SUM Case As ColumnName 声明 像这样 SELECT SKU1 SUM Case When Sku2 157 Then Quantity Else 0 End A
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • TSQL - 创建从日期表,同时忽略带条件的中间步骤

    我在 MS SQL 服务器中有以下表结构 现在 我想根据以下规则获取每个 id 的 in 日期 如果第二天 23 59 出 和 00 00 进 则忽略这些 如果同一天有 out 和 in 请忽略这些 例如我应该得到以下结果 id in ou
  • 如何重命名 SQL Server 中名称中带有方括号的内容?

    我的一张桌子上有一列 周围有方括号 Book Category 我想重命名为Book Category 我尝试了以下查询 sp rename BookPublisher Book Category Book Category COLUMN
  • Sequelize mssql:按主键和限制排序

    我想运行一个使用主键对结果进行排序的查询 并限制返回结果的数量 例如 return Things findAll attributes id status otherField limit 2 order id DESC 构建查询时 会生成
  • 如果不存在则插入数据(来自 2 个表),否则更新

    再会 我有3张桌子 tbl仓库产品 ProductID ProductName ProductCode Quantity tbl分公司产品 ProductID ProductCode ProductCode Quantity Locatio
  • 如何将存储过程中的值返回到 EF

    我试图通过 EF 调用存储过程并从存储过程中检索返回值 我用过this https stackoverflow com questions 6861737 executesqlcommand with output parameter an
  • 插入并发问题-多线程环境

    我有一个问题 即使用完全相同的参数在完全相同的时间调用相同的存储过程 存储过程的目的是获取记录 如果存在 或创建并获取记录 如果不存在 问题是两个线程都在检查记录是否存在并报告错误 然后都插入新记录 在数据库中创建重复记录 我尝试将操作保留
  • 将数据从 MS SQL 导入 MySQL

    我想从 MS SQL Server 导入数据 通过某种正则表达式运行它以过滤掉内容 然后将其导入 MySQL 然后 对于每个查询 我希望显示来自第三个数据库的相关图像 明智地导入和链接 最简单的方法是什么 谢谢 澄清 它是一个 PHP 应用
  • 当没有文件可供下载时,如何避免 SSIS FTP 任务失败?

    我正在使用 SQL Server 2005 并在 SSIS 中创建 ftp 任务 有时会有文件需要通过 ftp 传输 有时则不会 如果没有文件 我不希望任务或包失败 我已将从 ftp 任务到下一个任务的箭头更改为 完成 以便包运行 我已将允
  • SQL 查询在多用户环境中返回错误值

    一段时间以来 我们在我们的一个客户站点上发现了奇怪的数据完整性问题 经过大量调查后 我们现在已将其隔离为数据库调用 如果两个用户同时调用同一个存储过程 有时一个用户会得到另一个用户的结果 我们设置了一个测试来验证这一点 并且我们有一个循环
  • SQL:将一个表中的所有记录插入到另一表中,而不指定列

    我想将备份表 foo bk 中的所有记录插入到 foot 表中 而不指定特定的列 如果我尝试这个查询 INSERT INTO foo SELECT FROM foo bk 我会收到错误 插入错误 列名称或提供的值的数量与表定义不匹配 是否可
  • SQL中如何合并多个表的数据

    我想我的处境很复杂 这是场景 我在 SQL Server 中有 3 个表 注册 学生 课程 仅供参考 没有外键 表的列是 Student 学生号 学生名 Course 课程 ID 课程名称 注册 注册 ID 学生 ID 课程 ID 课程结果
  • 如何识别 SQL Azure 中的死锁?

    我有一个由两个实例组成的 Windows Azure 角色 有时交易会失败并显示SqlException与以下文字 事务 进程 ID N 在锁资源上与另一个进程发生死锁 并被选为死锁牺牲品 重新运行事务 现在我已经谷歌搜索了一段时间并阅读这
  • SQL Server 返回了不完整的响应。连接已关闭。;嵌套异常是 com.microsoft.sqlserver.jdbc.SQLServerException:

    我们正在将 Spring Batch 应用程序从 Oracle DB 迁移到 Azure SQL Server 该应用程序运行几个小时50线程 下面是我的 JDBC 配置 MSSQL DRIVERCLASSNAME com microsof
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上

随机推荐