问题
我们需要在 MS SQL Server 2019 上使用正则表达式的主要问题,至少具有 POSIX 正则表达式级别的能力。
可能的解决方案
这个来自 stackoverflow的 Q/A正确地得出结论,如果您的查询必须依赖正则表达式,您应该使用 CLR。这篇 Readgate文章更详细地阐述了这种方法。所以我和我的一位同事提出了这个解决方案,但是我的另一位同事断然表示,这里使用 CLR 会对安全性和稳定性造成巨大风险,使用外部脚本(Python 或 R)更安全。
这似乎是可疑的说法,因为CLR 中的用户代码是可以管理的,所以也许相反,但我无法说服我的同事。
在我绝望中写的另一个问题中,因为我被迫使用外部脚本并且仍然产生极快的查询。SQLpro 用户在他的评论中指出:
就安全性而言,使用 Python 或 R 可能比使用 CLR 更差!
我倾向于相信。
问题
所以我有两个问题:
好吧,您的同事绝对是错误的(除非他们可以提供此类主张的实际证据)。
安全
自从 SQLCLR 在 SQL Server 2005 中引入以来,人们一直在说它是“不安全的”。但是,我还没有看到有人真正证明它确实不安全。我见过的唯一所谓的“证据”是有人加载了一个将文件写入磁盘的程序集,并声称由于它可以写入磁盘,因此这是一个安全漏洞。但是,这是一个错误的说法,因为:
TRUSTWORTHY
启用或使用签名/证书来访问外部资源。如果您已经拥有提升的权限以便 a) 创建和 b) 执行所需的代码以使其看起来像您正在获得提升的权限,那么这并不是获得提升权限的证据。
SQLCLR 并非天生不安全。当然,它可能会被错误地使用以意外允许某人获得提升的权限等,但它本身是安全的。
EXECUTE AS 'dbo'
而且,只要在存储过程或函数中使用就很容易引入安全漏洞,这就是纯 T-SQL。以下是我写的关于 SQLCLR 安全性主题的几篇文章:
话虽如此,在使用正则表达式的上下文中,SQLCLR 和外部脚本都是“安全的”(假设您不允许临时访问用户提交他们想要的任何随机 Python 代码)。
可用性
这是一个主要区别:外部脚本通过存储过程执行。这意味着,您可以对单个值执行 RegEx。如果可以将 RegEx 函数集成到
SELECT
and/orWHERE
子句中(我知道您可以传入查询并返回结果集),那么它充其量是笨重的,当然也不容易维护。而使用 SQLCLR,您可以创建标量函数和表值函数,这些函数很容易集成到查询中以获得适当的基于集合的解决方案(请记住:不进行任何数据访问的正确编码的 SQLCLR 标量函数可以参与并行计划)。如果您想要 RegEx 函数而无需编译任何东西,那么免费版本的SQL# (SQLsharp)中有很多可用的,这是我编写的一个 SQLCLR 库。
有关一般使用 SQLCLR 的更多信息,请访问我的网站:SQLCLR Info
第一:SQL CLR的安全级别就像汽车的安全气囊 + ABS + Lane Sense。当您使用这三种设备时,您在安全性方面处于最高水平。那是 SQL CLR 的 SAFE 级别。如果不使用其中一种处置方式,您将处于 EXTERNAL_ACCESS 中,而没有任何这些处置方式,您将处于 UNSAFE 中。
第二:在任何其他语言中根本没有这样的安全级别,让人相信那些其他语言是安全的,这是不正确的......如果你想开车并且所有以前的设备都不见了,所以没有任何迹象这辆车的任何安全级别……这辆车安全吗?
举个例子,如果出现不良行为,SQL CLR 进程可能会被丢弃在沙箱中。对于其他语言来说,这根本不是真的!我总是用同样的技巧来证明它:使用带有无限递归的 SQL CLR。该过程将被拍摄,SQL Server 服务将继续存在。使用外部 Java 机器来做同样的事情,将导致你的 SQL Server 宕机,因为 Java 将获取所有内存,从而损害 SQL Server...
现在你有选择了!