Sql server 启用SQL CLR的目的和风险是什么?
我们希望使用tSQLt测试框架实现单元测试。必须使用以下命令启用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
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允许执行以下操作之一:
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“更好”(在我看来),因为它不会向正在测试的服务器或数据库添加任何内容。然而,无论您选择什么方法,都不应该在生产环境中进行测试。