我们希望使用tSQLt测试框架实现单元测试。它具有必须使用以下命令启用SQL CLR的先决条件:
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
我很想知道SQL CLR的目的是什么以及在生产环境中启用它的风险?
答案 0 :(得分:2)
<强>用途强>
SQLCLR允许人们做以下事情:
有很多事情可以在两者中完成,而且T-SQL实际上要好得多。在这些情况下,使用SQLCLR是不恰当的,所以最好首先进行研究以确保无法在T-SQL中完成操作,或者肯定会更慢。
例如,性能方面,T-SQL标量UDF会阻止并行执行计划。但是SQLCLR标量UDF,只要没有数据访问且标记为IsDeterministic=true
,不就会阻止并行执行计划。
有关SQLCLR是什么和不是什么的更多详细信息,请参阅我为SQL Server Central编写的Stairway to SQLCLR系列中的第一篇文章:
Stairway to SQLCLR Level 1: What is SQLCLR?
或者,为了了解SQLCLR中可以做什么,请参阅我的SQL#项目,这是一个包含320多个存储过程和函数的库,其中许多都是免费版本,其中许多都可以工作在SAFE
模式下:SQLsharp.com。
<强>风险强>
风险因大会被标记为的PERMISSION_SET
(即SAFE
,EXTERNAL_ACCESS
和UNSAFE
)以及正在执行的操作而有所不同。可以在UNSAFE程序集中执行无法在常规T-SQL中执行的操作(除了许多危险的事情已经可以通过一些扩展存储过程,xp_cmdshell和OLE自动过程完成 - {{1} })。标记为sp_OA*
的程序集无法到达数据库之外,因此通常非常安全,但您仍然可以通过正则表达式锁定系统,该正则表达式会暴露灾难性的回溯&#34; (当然,这可以通过在.NET Framework 4.5中开始减轻,因此SQL Server 2012及更高版本,通过设置RegEx操作的最大时间限制)。标记为SAFE
的程序集可以写入静态变量,这些变量在SQLCLR使用的共享App Domain模型的上下文中允许Sessions之间的共享内存。这可以允许缓存,但如果使用不当,很容易导致竞争条件。
<强>测试强>
至于tSQLt,我不认为你需要使用SQLCLR组件。我以为我看到它只是启用了一些扩展功能。无论哪种方式,源代码都可以在GitHub上获得,因此您可以查看它以查看它正在做什么。我看了它已经有一段时间了,但是从我记忆中来看,它不应该为它所做的那么小的风险(特别是在Dev / QA环境中)。
不使用SQLCLR的另一个选项是DbFit。我总是喜欢DbFit,因为它完全是DB的外部。它基于FitNesse框架,用Java编写,您可以通过wiki风格的页面管理测试。默认情况下,它将测试包装在一个Transaction中,并在测试完成后将所有内容都回滚(即清理)。值得一看。
下载:DbFit project on GitHub
教程:Using the DbFit Framework for Data Warehouse Regression Testing
答案 1 :(得分:1)
SQLCLR允许您从SQL Server中创建.NET程序集并在其中运行代码。
根据程序集的权限,风险会有所不同。风险是这样的:
权限集:风险
SAFE
除了T-SQL中的功能之外,你无法做更多的事情。太安全了。
EXTERNAL ACCESS
您可以在Microsoft批准的.NET程序集中调用代码,例如ADO.NET。相当安全,但仍有风险。
UNSAFE
您几乎可以执行.NET框架允许您执行的任何操作。实际上,除非你知道自己在做什么,否则要把自己射向头脑。