Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 启用SQL CLR的目的和风险是什么?_Sql Server_Sqlclr_Tsqlt - Fatal编程技术网

Sql server 启用SQL CLR的目的和风险是什么?

Sql server 启用SQL CLR的目的和风险是什么?,sql-server,sqlclr,tsqlt,Sql Server,Sqlclr,Tsqlt,我们希望使用tSQLt测试框架实现单元测试。必须使用以下命令启用SQL CLR,这是一个先决条件: EXEC sp_configure 'clr enabled', 1; RECONFIGURE; 我很想知道SQL CLR的目的是什么,以及在生产环境中启用它的风险是什么?SQLCLR允许您从SQL Server中创建.NET程序集并在其中运行代码 根据程序集上的权限,风险会有所不同。风险是这样的: 权限集:风险 SAFE除了在T-SQL中可以做的之外,您不能做任何事情。所以相当安全 EXTER

我们希望使用tSQLt测试框架实现单元测试。必须使用以下命令启用SQL CLR,这是一个先决条件:

EXEC sp_configure 'clr enabled', 1; RECONFIGURE;

我很想知道SQL CLR的目的是什么,以及在生产环境中启用它的风险是什么?

SQLCLR允许您从SQL Server中创建.NET程序集并在其中运行代码

根据程序集上的权限,风险会有所不同。风险是这样的:

权限集:风险
SAFE
除了在T-SQL中可以做的之外,您不能做任何事情。所以相当安全

EXTERNAL ACCESS
您可以在Microsoft批准的.NET程序集中调用代码,例如ADO.NET。相当安全,但仍然存在风险


UNSAFE
您几乎可以做.NET framework允许您做的任何事情。事实上,除非你知道自己在做什么,否则就开枪打自己的脑袋。

目标

SQLCLR允许执行以下操作之一:

  • 无法在t-SQL中完成,或者
  • 不能像t-SQL那样高效地完成
  • 在这两种方法中都可以做很多事情,而T-SQL实际上在这方面做得更好。在这些情况下,使用SQLCLR来完成这些事情是不合适的,因此最好先研究一下,以确保操作不能在T-SQL中完成,或者肯定会更慢

    例如,在性能方面,T-SQL标量UDF会阻止并行执行计划。但是,只要SQLCLR标量UDF没有数据访问,并且它们被标记为
    IsDeterministic=true
    ,就不会阻止并行执行计划

    有关什么是SQLCLR和什么不是SQLCLR的更多详细信息,请参阅我为SQL Server Central编写的系列文章的第一篇:

    或者,要了解SQLCLR可以做些什么,请参阅我的SQL#项目,它是一个包含320多个存储过程和函数的库,其中许多是免费版本,许多是在
    安全
    模式下工作的:

    风险

    风险因程序集标记为的
    权限集
    (即
    安全
    外部访问
    、以及
    不安全
    )以及正在执行的操作而异。可以在不安全的程序集中执行常规T-SQL无法执行的操作(除了许多危险的操作已经可以通过一些扩展存储过程、xp\u cmdshell和OLE自动过程--
    sp\u OA*
    执行)。标记为
    SAFE
    的程序集无法到达数据库外部,因此通常相当安全,但您仍然可以通过公开“灾难性回溯”的正则表达式锁定系统(当然,从.NET Framework 4.5(SQL Server 2012及更高版本)开始,可以通过设置RegEx操作的最大时间限制来缓解这一问题)。标记为
    不安全的程序集可以写入静态变量,在SQLCLR使用的共享应用程序域模型的上下文中,静态变量允许在会话之间共享内存。这可以允许缓存,但如果使用不当,很容易导致争用情况

    测试

    至于tSQLt,我不认为您需要使用SQLCLR组件。我想我看到它只是启用了一些扩展功能。无论哪种方式,源代码都可以在GitHub上获得,因此您可以查看它,看看它在做什么。我已经有一段时间没有看过它了,但根据我的记忆,它不应该提供太多的功能它所做的很少(特别是在开发/质量保证环境中)的风险

    另一个不使用SQLCLR的选项是DbFit。我一直更喜欢DbFit,因为它完全位于数据库外部。它基于FitNesse框架,用Java编写,您可以通过wiki样式的页面管理测试。默认情况下,它将测试包装在事务中,并在测试完成后回滚所有内容(即清理).值得一看

    下载:

    教程:

    SQLCLR是在仅T-SQL不足以实现所需功能时需要的。如果是tSQLt,则它使用CLR对象来提供使用T-SQL语言无法实现的单元测试功能。启用CLR会增加表面积,因此只有在需要时才应启用。不确定为什么要运行单元测试但是,sts在生产环境中。最好在prod中禁用它,并在测试环境中运行单元测试。我完全同意@DanGuzman re:不在生产环境中进行单元测试。这似乎是一个有待解决的问题,不管SQLCLR如何。我如何检查权限集值?正如@Solomon Rutzky在上面评论的,您可以Heeck允许值:<代码>从SysCs集会中选择PERISEXIOSSETYDESC。在这里,Name=“AsthyCulyMyName”< /代码>。我如何检查权限集值?此外,我们能考虑DbFit在生产数据库上使用的好吗?1)您可以使用以下查询检查
    PERMISSION\u SET
    值:
    SELECT*FROM sys.assemblies。2) DbFit“更好”(在我看来),因为它不会向正在测试的服务器或数据库添加任何内容。然而,无论您选择什么方法,都不应该在生产环境中进行测试。