启用S​​QL CLR的目的和风险是什么?

时间:2018-06-08 11:27:27

标签: sql-server sqlclr tsqlt

我们希望使用tSQLt测试框架实现单元测试。它具有必须使用以下命令启用SQL CLR的先决条件:

EXEC sp_configure 'clr enabled', 1; RECONFIGURE;

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

2 个答案:

答案 0 :(得分:2)

<强>用途

SQLCLR允许人们做以下事情:

  1. 无法在T-SQL或
  2. 中完成
  3. 不能像在T-SQL中那样有效地完成
  4. 有很多事情可以在两者中完成,而且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(即SAFEEXTERNAL_ACCESSUNSAFE)以及正在执行的操作而有所不同。可以在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框架允许您执行的任何操作。实际上,除非你知道自己在做什么,否则要把自己射向头脑。