AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 186957
Accepted
Solomon Rutzky
Solomon Rutzky
Asked: 2017-09-27 10:08:26 +0800 CST2017-09-27 10:08:26 +0800 CST 2017-09-27 10:08:26 +0800 CST

升级到 SQL Server 2017 后,错误消息 10314、级别 16、状态 11 和 SAFE 程序集

  • 772

我有一个 pre-SQL Server 2017 数据库,我将它还原到/升级到 SQL Server 2017。在这个数据库中,我有一个 SQLCLR 程序集。该程序集被标记为,SAFE因为它不执行任何需要更高级别权限的操作,并且数据库已TRUSTWORTHY禁用 / OFF。SQLCLR 函数和存储过程在迁移到 SQL Server 2017 之前按预期工作,但现在当我尝试执行其中任何一个时,我收到以下错误:

消息 10314,级别 16,状态 11,服务器 XXXXXXXXXXX,行 YYYYYY
      尝试加载程序集 ID ZZZZZ 时,Microsoft .NET Framework 中发生错误。服务器可能资源不足,或者程序集可能不受信任。再次运行查询,或查看文档以了解如何解决程序集信任问题。有关此错误的更多信息:
      System.IO.FileLoadException:无法加载文件或程序集“{assembly_name},版本=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。发生与安全有关的错误。(来自 HRESULT 的异常:0x8013150A)

我已经确认在服务器/实例上启用了 CLR 集成/SQLCLR。

sql-server errors
  • 1 1 个回答
  • 5552 Views

1 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2017-09-27T10:08:26+08:002017-09-27T10:08:26+08:00

    该错误是clr strict securitySQL Server 2017 中新的服务器级配置选项的结果。这个新的安全设置不允许创建任何程序集,即使是那些标记为 的程序集,也不允许SAFE创建或加载到内存中执行,除非:

    • 的 Database 属性TRUSTWORTHY(ON不要这样做,因为这是不必要的安全风险)并且作为数据库所有者的登录名(即[dbo]用户使用的相同 SID)需要具有UNSAFE ASSEMBLY权限(如果所有者可能已经拥有该权限)是sa 或sysadmin固定服务器角色的成员或可能具有CONTROL SERVER权限)。
    • 的服务器级配置选项clr strict security被禁用/ 0(不要这样做,因为它是一个不必要的安全风险)
    • 程序集已签名,并且您有一个相应的基于签名的登录名,该登录名已被授予UNSAFE ASSEMBLY权限(请执行此操作)
    • 程序集的 SHA-512 哈希被注册为“受信任的程序集”(绝对不要这样做,因为它有很多问题,更不用说一开始就不需要它)

    为了解决这种情况,您需要做的就是执行以下步骤(这些步骤并不困难并且提供最高级别的安全性):

    1. 在程序集所在的数据库中创建证书
    2. 将证书(公钥和私钥)备份到文件(可选)
    3. 用证书签署程序集(或程序集)
    4. 删除私钥(可以稍后从备份文件中恢复)(可选)
    5. 对于每个具有未签名的附加数据库,程序SAFE集:
      1. 跳过这个子步骤(即跳到第 6 步),完成这些步骤,然后重复整个过程(这将导致每个数据库需要一个证书),或者
      2. 执行以下操作(这将产生一个证书总数,将用于所有数据库):
        1. 从备份文件创建相同的证书(包括私钥!)
        2. 用证书签署程序集(或程序集)
        3. 删除私钥(以后可以从备份文件中恢复)
    6. 将证书复制到[master](仅限公钥!)
    7. 从证书创建登录
    8. 授予基于证书的登录UNSAFE ASSEMBLY权限

    一个简单的例子(减去可选的备份和私钥删除)是:

    USE [{database_containing_unsigned_safe_assembly}];
    
    CREATE CERTIFICATE [{certificate_name}]
      ENCRYPTION BY PASSWORD = '{some password}'
      WITH SUBJECT = '{simple description}',
      EXPIRY_DATE = '2099-12-31';
    
    ADD SIGNATURE
      TO Assembly::[{assembly_name}]
      BY CERTIFICATE [{certificate_name}]
      WITH PASSWORD = '{some password}';
    
    DECLARE @PublicKey VARBINARY(MAX),
            @SQL NVARCHAR(MAX);
    
    SET @PublicKey = CERTENCODED(CERT_ID(N'{certificate_name}'));
    
    SET @SQL = N'
    CREATE CERTIFICATE [{certificate_name}]
      FROM BINARY = ' + CONVERT(NVARCHAR(MAX), @PublicKey, 1) + N';';
    PRINT @SQL; -- DEBUG
    
    EXEC [master].[sys].[sp_executesql] @SQL;
    
    EXEC [master].[sys].[sp_executesql] N'
    CREATE LOGIN [{login_name}]
      FROM CERTIFICATE [{certificate_name}];
    
    GRANT UNSAFE ASSEMBLY TO [{login_name}]; -- REQUIRED!!!!
    ';
    

    可以在 PasteBin 上找到一个完整的工作示例(减去备份和私钥删除):
    避免“受信任的程序集”-演示

    我的博客文章中提供了有关为什么应该使用证书以及为什么不应该使用“受信任的程序集”来解决此问题的详细说明:
    SQLCLR 与 SQL Server 2017,第 4 部分:“受信任的程序集” - 失望

    另外,请考虑支持我的请求,即让 Microsoft 删除新的“受信任的程序集”功能,因为它存在许多问题(包括安全问题),并且总体上缺乏使用它的好处:

    可信程序集比证书更成问题但功能更少 - 请删除

    • 6

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve