4

我需要使用 SQLCLR 来制作一个使用 .NET 3.5 中的东西的存储过程。如果我不使用PERMISSION_SET = UNSAFE我做不到,它就会死掉并给我这个错误:

部署错误 SQL01268:.Net SqlClient
数据提供程序:消息 6503,级别 16,状态 12,第 1 行
程序集“system.core,版本=3.5.0.0,文化=中性,publickeytoken=b77a5c561934e089。” 在 SQL 目录中找不到。
执行批处理时发生错误。

于是我找到了这篇文章:

http://weblogs.asp.net/paulomorgado/archive/2009/06/13/playing-with-sql-server-clr-integration-part-iv-deploying-to-sql-server-2005.aspx

最后一行是这样说的:

“现在 DBA 肯定不会让我使用它,但构建它很有趣。”

我不确定他是否指的是权限设置为“不安全”。

那么,如果你这样做,会出现一些巨大的缺口吗?

4

3 回答 3

6

有 3 个不同的 permission_set 选项限制了程序集可以做什么

SAFE- 将程序集限制为托管代码

EXTERNAL_ACCESS- 允许访问文件、网络资源等。

UNSAFE- 不受限制的访问 - 包括非托管代码的执行

MSDN文档提供以下指导

指定 UNSAFE 使程序集中的代码可以完全自由地在 SQL Server 进程空间中执行可能会损害 SQL Server 稳健性的操作。UNSAFE 程序集还可能破坏 SQL Server 或公共语言运行时的安全系统。UNSAFE 权限应仅授予高度受信任的程序集。

如果您的程序集仅使用 .NET 3.5 的功能,我不明白为什么它需要UNSAFE访问。

您可能正在使用 System.Core 库中不允许的类型或成员之一。微软有一个清单。System.Core.dll 中不允许的类型和成员

这里有更多信息。主机保护属性和 CLR 集成编程

于 2010-07-09T00:46:12.593 回答
1

对于三个安全级别,公认的答案是正确的,但对于UNSAFE此处所需的原因是错误的。

实际上有两个问题被问到:

  1. 将程序集设置为安全PERMISSION_SET = UNSAFE吗?

    不管有些人会抱怨什么,安全级别没有任何本质上的错误或“不安全” 。权限集确实允许人们做一些UNSAFE容易损害系统安全性和/或稳定性的事情,但没有说所有被认为“不安全”的功能都会产生任何影响。而且,写得不好的查询/存储过程/函数会对系统性能和稳定性产生不利影响。仅仅因为一个功能可以被滥用并不意味着它不能被正确地用于做很棒的事情。UNSAFE

    SQL Server 的 CLR 主机与主要的 Windows 操作系统 CLR 主机分开(两者都或应该与 ASP.NET CLR 主机分开)受到严格限制,它们仅包含 .NET Framework 的一小部分。所包含的库(可以在此处找到:支持的 .NET Framework 库)保证在 SQL Server 更新和服务器级别的 .NET Framework 更新(即补丁、升级等)中都能正常工作。还有一些不在该列表中的库,就它们的功能而言,它们使用起来是完全“安全”的,但由于根本不在“支持”列表中,因此它们需要注册为UNSAFE因为它们尚未经过测试并且不保证在 .NET Framework 更新中保持可用。例如,ServiceModel我相信,它是 .NET 2 和 3 中的纯 MSIL 库。但是,它从 .NET 4 开始变成了混合模式(即包含一些非托管代码),并且由于 SQL Server 2012 和更新版本仅链接到 CLR v4,web服务代码再次编写ServiceModel,在 2012 版之前的 SQL Server 版本中运行良好,从 2012 版开始停止工作。

  2. 如果我没有将程序集设置为 ,为什么会收到提及system.core的错误?PERMISSION_SET = UNSAFE

    此问题特定于 SQL Server 2005。SQL Server 2005 是第一个包含对 .NET 功能(即 SQLCLR)的支持的版本。System.Core库在 .NET Framework 2.0 中不存在,.NET Framework 3.0 直到 2006 年底才发布(请参阅:.NET Framework 版本历史)。由于这个时间安排,System.Core无法包含在 SQL Server 2005 的 CLR 主机中。但是,由于 .NET 3.0 和 3.5 使用 CLR v2,就像 .NET Framework 2.0 一样,可以在SQL Server 2005如果您将程序集设置为UNSAFE,则允许查看 SQL Server 的内部 CLR 主机之外的内容。

    SQL Server 2008 和 2008 R2 都在其内部 CLR 主机中包含 .NET Framework 3.5,并且他们在“支持”列表中添加了另外两个库,一个是System.Core。因此,对于这两个版本,您可以在程序集中使用System.Core中的功能SAFE。而且,这就是为什么System.Core位于“支持的 .NET Framework 库”列表(上面链接)底部的原因。

有关与 SQLCLR 相关的 .NET 细微差别的更多信息,请参阅我的文章,SQLCLR 第 5 级的阶梯:开发(在 SQL Server 中使用 .NET)以及SQL Server Central 上的整个“ SQLCLR 阶梯”系列。

有关一般使用 SQLCLR 的更多信息,请访问:SQLCLR 信息

于 2019-03-04T17:11:57.540 回答
-3

很抱歉说的很明显,但是“不安全”的哪一部分难以理解?

你可以:

  • 销毁您的 SQL Server 和操作系统安装
  • 引入内存泄漏
  • 添加不稳定性

我假设与您的问题“如何使这个 CLR 与 2005 一起工作?”有关。您想在哪里使用可能具有后两种副作用的方法...

于 2010-07-09T06:30:28.217 回答