突破T-SQL限制:利用CLR集成扩展RDS SQL Server的功能边界

简介: CLR集成为SQL Server提供了强大的扩展能力,突破了T-SQL的限制,极大地拓展了SQL 的应用场景,如:复杂字符串处理、高性能计算、图像处理、机器学习集成、自定义加密解密等,使开发人员能够利用 .NET Framework的丰富功能来处理复杂的数据库任务。

欢迎扫描文末二维码,关注「阿里云开发者」公众号,了解更多技术干货,关于阿里的技术创新均呈现于此。


一、前言


SQL Server 的 Common Language Runtime (CLR) 集成是一种允许开发人员使用 .NET Framework 的编程语言(如 C# )编写和执行存储过程、触发器、用户自定义函数(UDF)以及其他数据库对象的功能。通过 CLR 集成,SQL Server 可以利用 .NET 能力处理更复杂的任务,例如字符串操作、文件处理、正则表达式解析等。这为开发人员提供了更强大的工具,尤其是在面对计算密集型任务或处理 T-SQL 无法有效解决的业务逻辑时,CLR 集成成为一种灵活且高效的解决方案。


本文通过DEMO,详细为大家介绍如何在阿里云数据库RDS SQL Server(下文简称 RDS SQL Server)中部署和使用CLR集成函数。


二、环境准备


先决条件

如果要部署CLR集成,首先需要配置 RDS SQL Server实例级参数“clr enabled”为1(该值默认为0)。登录RDS SQL Server控制台,进入参数设置页面,找到 clr enabled参数,即可启用CLR选项,如图1所示:


image.png



DEMO程序:情绪偏好分析函数

下面我们通过一个DEMO程序(简单的情绪偏好分析函数)阐述如何将CLR部署到RDS SQL Server。该DEMO程序设置一个简单的词库和分词逻辑,给定评论内容,将内容与词库中的词简单对比,得出情绪分。


DEMO程序 C# 代码如下:


public class SentimentAnalysis
{
    [SqlFunction(IsDeterministic = true, IsPrecise = true)]
    public static SqlDouble AnalyzeSentiment(SqlString text)
{
        if (text.IsNull)
            return SqlDouble.Null;

        var sentimentDictionary = InitializeSentimentDictionary();

        string input = text.Value.ToLower();
        double sentimentScore = 0;
        int wordCount = 0;
        int i = 0;

        while (i < input.Length)
        {
            bool matched = false;
            // 从当前位置开始尝试匹配词典中的最长词语
            foreach (var entry in sentimentDictionary.Keys.OrderByDescending(k => k.Length))
            {
                if (i + entry.Length <= input.Length && input.Substring(i, entry.Length) == entry)
                {
                    sentimentScore += sentimentDictionary[entry];
                    wordCount++;
                    i += entry.Length;  // 跳过已匹配的词语
                    matched = true;
                    break;
                }
            }

            // 如果没有匹配到词典中的词语,则跳过该字符
            if (!matched)
            {
                i++;
            }
        }

        return new SqlDouble(wordCount > 0 ? sentimentScore / wordCount : 0);
    }

    private static Dictionary<string, double> InitializeSentimentDictionary()
{
        return new Dictionary<string, double>
        {
            {"好", 1.0}, {"喜欢", 1.0}, {"优秀", 1.0}, {"棒", 1.0}, {"满意", 0.8},
            {"不错", 0.6}, {"还行", 0.2}, {"一般", 0},
            {"差", -0.6}, {"糟糕", -0.8}, {"失望", -0.8}, {"烂", -1.0}, {"讨厌", -1.0}
        };
    }
}


三、将CLR程序集导入RDS SQL Server


导出CLR程序集为二进制字符串

数据库作为PaaS层程序,用户无法访问RDS SQL Server所在的操作系统,因此不能直接编译如下“创建程序集”的代码。我们可以先将C#的CLR代码编译为DLL,然后通过拥有OS访问权限的RDS SQL Server创建程序集,如下代码所示。


-- 创建程序集
CREATE ASSEMBLY [CLRFuncDemo]
FROM 'E:\Backup\CLRFuncDemo.dll'
WITH PERMISSION_SET = SAFE


接着,通过RDS SQL Server的导出功能,将该程序集导出为二进制字符串,如图2。


image.png



导入CLR程序集至RDS SQL Server

过拥有当前指定数据库DBO权限的用户连入RDS SQL Server,将导出的CLR程序集通过二进制的方式进行创建,如图3所示。


image.png

在图4中,可以看到程序集与CLR函数已经被成功导入与创建。


image.png


测试CLR函数

下面我们通过一个简单的表测试数据,DEMO测试CLR函数的可用性,代码如下所示。


CREATE TABLE UserReviews (
    ReviewID INT IDENTITY(1,1) PRIMARY KEY,
    Username NVARCHAR(50),
    ProductName NVARCHAR(100),
    ReviewContent NVARCHAR(MAX),
    ReviewDate DATETIME
)


INSERT INTO UserReviews (Username,ProductName,ReviewContent,ReviewDate) 
VALUES 
    ('Chen Qi','Smartphone E',N'这个手机太烂了,电池续航糟糕,我非常失望!','2024-03-25 13:00:00'),
    ('Zhou Ba','Laptop F',N'体验非常差,散热不好,性能糟糕,不推荐!','2024-03-26 14:30:00'),
    ('Sun Jiu','Headphones G',N'音质太差了,这耳机真是糟糕透顶,让我很失望!','2024-03-27 16:10:00'),
    ('Wu Shi','Tablet H',N'这个平板还行,性能一般,用起来也算可以.','2024-03-28 10:00:00'),
    ('Zhang Yi','Smartphone I',N'手机用起来一般,没有特别好,也没有特别差,算是中规中矩.','2024-03-29 11:20:00'),
  ('Li Si','Laptop B',N'这个笔记本真的是优秀! 性能很棒,非常喜欢,满意极了!','2024-03-20 09:15:00'),
    ('Wang Wu','Headphones C',N'声音非常棒,材质很好,使用体验一流,我非常满意!','2024-03-22 11:00:00'),
    ('Zhao Liu','Tablet D',N'这款平板真是不错,性能很强,续航也不错,我非常喜欢!','2024-03-24 15:45:00'),
  ('Wang Kang','Smartphone K',N'手机非常好用,拍照效果非常棒,我非常喜欢!','2024-03-31 12:05:00');



SELECT 
    ReviewID,
    Username,
    ProductName,
    ReviewContent,
    dbo.AnalyzeSentiment(ReviewContent) AS SentimentScore,
    CASE 
        WHEN dbo.AnalyzeSentiment(ReviewContent) > 0.3 THEN '好评'
        WHEN dbo.AnalyzeSentiment(ReviewContent) < -0.3 THEN '差评'
        ELSE '中立'
    END AS SentimentCategory
FROM UserReviews
ORDER BY SentimentScore DESC

结果如图5所示,基本能够符合预期,通过提取评论中的关键字,确认当前的平均是好评或差评。


image.png


四、其他安全问题

如果在 RDS SQL Server 中创建或修改 CLR 程序集 “CLRFuncDemo” 时遇到了以下错误:


消息 10343,级别 14,状态 1,第 12 行
针对带有 SAFE 或 EXTERNAL_ACCESS 选项的程序集“CLRFuncDemo”的 CREATE 或 ALTER ASSEMBLY 失败,因为 sp_configure 的“CLR 严格安全性”选项设置为 1。Microsoft 建议使用其相应登录名具有 UNSAFE ASSEMBLY 权限的证书或非对称密钥为该程序集签名。或者,也可以使用 sp_add_trusted_assembly 信任程序集。


这个报错是由于自动SQL Server 2017开始,微软对CLR集成的安全性做了更严格的限制,通过引入clr strict security选项,并将默认值设置为1,确保只有经过签名的程序集才能以安全级别(SAFE 或 EXTERNAL_ACCESS)进行加载。

如果希望解决该问题,尝试使用下面3种方法之一:


方法一:签名程序集并授予相应权限(微软推荐做法)

签名的作用本质上是让SQL Server确认发布者的身份,并与对应关联最小化权限,从而保证了CLR的安全。


整体过程相对较为复杂,具体操作步骤参考:

https://sqlquantumleap.com/2017/09/29/sqlclr-vs-sql-server-2017-part-6-trusted-assemblies-cant-do-module-signing/


方法二:使用 sp_add_trusted_assembly 信任程序集

sp_add_trusted_assembly 可以允许单独对程序集进行类似白名单豁免的操作,同时不需要改程序集进行签名。

但该方式同样较为复杂,且执行该存储过程需要SA权限,相比方法一,更不推荐。


方法三:禁用“clr strict security”选项

SQL Server作为PaaS服务,没有实例级的访问权限,因此不能通过默认的方式直接关闭clr strict security选项,一个可选的方案是通过RDS提供的超级管理员账号关闭该选项。


警告:禁用 clr strict security 会使所有 CLR 程序集以更高的权限运行,可能带来安全隐患。


我们可以通过控制台创建“超级权限账号”,该账号的权限视为sql server内置的sysadmin组权限,值得注意的是,就像经典台词所说:“能力越大,责任越大”,拥有SA权限后,RDS不再保障SLA,同时该操作是单行票,启用后无法关闭。


image.png


使用SA账号关闭clr strict security的SQL如下所示:


EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

EXEC sp_configure 'clr strict security', 0;
RECONFIGURE;

禁用该选项后,可以成功创建。



五、总结

CLR集成为SQL Server提供了强大的扩展能力,使开发人员能够利用.NET Framework的丰富功能来处理复杂的数据库任务。本文通过详细的步骤和实例演示了如何在阿里云RDS SQL Server中部署和使用CLR集成功能。


CLR的集成极大地拓展了SQL Server的应用场景。通过CLR,我们可以在SQL Server中实现T-SQL难以实现的业务场景,比如:


  1. 复杂字符串处理:例如利用.NET的正则表达式库,实现医疗病历文本解析、数据清洗等高级文本处理
  2. 高性能计算:例如处理金融领域的期权定价等复杂数学运算,发挥编译执行的性能优势
  3. 文件和网络操作:例如实现物流行业的自动化单据处理,支持跨系统数据交换
  4. 自定义加密解密:例如为银行业提供端到端加密方案,保护敏感数据安全
  5. 图像处理:例如支持零售行业的商品图片分析、质量检测等多媒体处理需求
  6. 机器学习集成:例如实现电商平台的实时商品推荐等智能分析功能
  7. 复杂业务逻辑:例如处理信用卡额度评估等多维度决策场景



使用CLR而不是在应用程序中实现上述功能, 从性能角度看,数据库端直接处理可以减少数据传输开销,提供更高的处理效率。从安全性来看,敏感数据的处理限制在数据库内部,能够有效降低风险。从维护角度考虑,业务逻辑集中存储便于统一管理和版本控制,同时支持多个应用系统共享相同的业务规则。

在实际项目中,T-SQL和应用程序层是实现业务功能的主要选择。T-SQL适合数据的查询、处理和基础业务逻辑,应用程序层则擅长处理复杂交互和业务流程。CLR并非要替代这两者,而是在特定场景下的一个补充选项。当我们遇到需要复杂字符串处理、高性能计算或者外部系统集成等场景,而T-SQL实现困难、放在应用程序层有性能、部署或安全层面的限制时,CLR可以作为一个补充方案。




来源  |  阿里云开发者公众号
作者  |  
沄迹




相关文章
|
10天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
14天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
5天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
10天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
5天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。
|
21天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3945 4
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
10天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
530 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
9天前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
16天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
995 3
|
14天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
447 18
白话文讲解大模型| Attention is all you need