启用 SQL CLR 的目的和风险是什么?
What is the purpose and risks of enabling SQL CLR?
我们正在寻求使用 tSQLt 测试框架实施单元测试。它有一个先决条件,即必须使用此命令启用 SQL CLR:
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
我很想知道 SQL CLR 的目的是什么以及在生产环境中启用它的风险?
SQLCLR 允许您在 SQL 服务器中创建 .NET 程序集和 运行 代码。
根据程序集的权限,风险会有所不同。风险是这样的:
权限集:风险
SAFE
除了在 T-SQL 中你能做的,你什么也做不了。所以相当安全。
EXTERNAL ACCESS
您可以调用微软认可的.NET程序集中的代码,例如ADO.NET。相当安全,但仍有风险。
UNSAFE
您几乎可以做 .NET 框架允许您做的任何事情。实际上,除非你知道自己在做什么,否则就朝自己的脑袋开枪。
目的
SQLCLR 允许一个人做以下事情:
- 无法在 T-SQL 或
中完成
- 无法像 T-SQL
那样高效地完成
两者都可以做很多事情,而 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 完成)自动程序——sp_OA*
)。标记为 SAFE
的程序集无法到达数据库外部,因此通常非常安全,但是您仍然可以通过公开 "catastrophic backtracking" 的正则表达式锁定系统(当然,这可以从.NET Framework 4.5,因此 SQL Server 2012 及更新版本,通过对 RegEx 操作设置最大时间限制)。标记为 UNSAFE
的程序集可以写入静态变量,在 SQLCLR 使用的共享应用程序域模型的上下文中,允许会话之间共享内存。这可以允许缓存,但如果使用不当,很容易导致竞争条件。
测试
至于tSQLt,我不认为你必须使用SQLCLR组件。我以为我看到它只是启用了一些扩展功能。无论哪种方式,源代码都可以在 GitHub 上找到,因此您可以查看它以了解它在做什么。我已经有一段时间没看过它了,但据我所知,它所做的小事应该不会带来太大风险(尤其是在开发/质量检查环境中)。
另一个不使用 SQLCLR 的选项是 DbFit。我一直更喜欢 DbFit,因为它完全位于数据库之外。它基于 FitNesse 框架,用 Java 编写,您可以通过 wiki 样式的页面管理测试。默认情况下,它将测试包装在事务中,并在测试完成时回滚所有内容(即清理)。值得一看
下载:DbFit project on GitHub
教程:Using the DbFit Framework for Data Warehouse Regression Testing
我们正在寻求使用 tSQLt 测试框架实施单元测试。它有一个先决条件,即必须使用此命令启用 SQL CLR:
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
我很想知道 SQL CLR 的目的是什么以及在生产环境中启用它的风险?
SQLCLR 允许您在 SQL 服务器中创建 .NET 程序集和 运行 代码。
根据程序集的权限,风险会有所不同。风险是这样的:
权限集:风险
SAFE
除了在 T-SQL 中你能做的,你什么也做不了。所以相当安全。
EXTERNAL ACCESS
您可以调用微软认可的.NET程序集中的代码,例如ADO.NET。相当安全,但仍有风险。
UNSAFE
您几乎可以做 .NET 框架允许您做的任何事情。实际上,除非你知道自己在做什么,否则就朝自己的脑袋开枪。
目的
SQLCLR 允许一个人做以下事情:
- 无法在 T-SQL 或 中完成
- 无法像 T-SQL 那样高效地完成
两者都可以做很多事情,而 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 完成)自动程序——sp_OA*
)。标记为 SAFE
的程序集无法到达数据库外部,因此通常非常安全,但是您仍然可以通过公开 "catastrophic backtracking" 的正则表达式锁定系统(当然,这可以从.NET Framework 4.5,因此 SQL Server 2012 及更新版本,通过对 RegEx 操作设置最大时间限制)。标记为 UNSAFE
的程序集可以写入静态变量,在 SQLCLR 使用的共享应用程序域模型的上下文中,允许会话之间共享内存。这可以允许缓存,但如果使用不当,很容易导致竞争条件。
测试
至于tSQLt,我不认为你必须使用SQLCLR组件。我以为我看到它只是启用了一些扩展功能。无论哪种方式,源代码都可以在 GitHub 上找到,因此您可以查看它以了解它在做什么。我已经有一段时间没看过它了,但据我所知,它所做的小事应该不会带来太大风险(尤其是在开发/质量检查环境中)。
另一个不使用 SQLCLR 的选项是 DbFit。我一直更喜欢 DbFit,因为它完全位于数据库之外。它基于 FitNesse 框架,用 Java 编写,您可以通过 wiki 样式的页面管理测试。默认情况下,它将测试包装在事务中,并在测试完成时回滚所有内容(即清理)。值得一看
下载:DbFit project on GitHub
教程:Using the DbFit Framework for Data Warehouse Regression Testing