SQL Server数据库托管代码的使用详解

SQL Server数据库托管代码的使用是本文我们主要要介绍的内容,我们知道,SQL Server是一个非托管的应用程序,但是开发人员可以用托管代码创建数据库存储过程、触发器或者函数。这样开发人员就可以利用其他语言来编写数据库存储过程、触发器或者函数,不仅可以使用FCL或其他程序集中的类型,还可以享受.net framerwork中强大类库的功能。

当***请求一个用托管代码写的存储过程时, MSSQL会加载CLR,存储过程会在独立的应用程序域运行,这样不会对数据库本身产生影响。托管代码会被JIT编译成本地代码执行,而不是解释执行,这保证了托管代码的执行效率。

编写托管代码

为了使用托管代码创建数据库存储过程、触发器或者函数,只需要对托管代码中具体方法使用Microsoft.SqlServer.Server命名空间下的特性:[SqlProcedure]、[SqlFunction]或者[SqlTrigger]。当然方法的参数和返回值相应会有一定的限制。

比如写一个随机散列算法的方法,声明成MSSQL的存储过程:

 

  1. GetHashText方法   
  2.  
  3. namespace Wuhong.ClrSp  
  4. {  
  5. public class StoredProcedures  
  6. {  
  7. [Microsoft.SqlServer.Server.SqlProcedure]  
  8. public static void GetHashText(string plainText, out string encryptedText, ref int hashProvider, ref string saltText)  
  9. {  
  10. //方法体略……  
  11.  }  
  12.  }  

 

至此,可以利用托管代码完成一切数据库脚本所无法完成的功能。

特别的,托管代码中也可以访问当前的数据库,但与普通方法访问数据库有两处不同:

一是连接字符串要使用上下文链接(Context Connection),”context connection=true”。这表示代码中的数据库上下文跟托管代码调用方的数据库上下文一致。

二是将结果集、消息或命令执行结果发送回客户端时需要通过数据库上下文专门的管道对象SqlContext.Pipe来发送。

开启CLR集成

默认情况下, CLR集成功能在MSSQL中处于禁用状态。若要使用 SQL CLR 项目项,必须启用 CLR 集成。

 

  1. sp_configure  
  2.  
  3. sp_configure 'clr enabled',1  
  4. GO  
  5.  RECONFIGURE  
  6. GO 

 

创建程序集

生成托管代码程序集后,需要在MSSQL中创建相应的托管应用程序模块,将其作为MSSQL实例中的对象。通过引用此模块,可在数据库中创建CLR函数、存储过程、触发器。

创建ASSEMBLY

  1. CREATE ASSEMBLY [Wuhong.ClrSp]   
  2. FROM 'F:\website\Wuhong.ClrSp.dll'  
  3. WITH PERMISSION_SET = SAFE

 

WITH PERMISSION_SET指定MSSQL向程序集授予的一组代码访问权限。SAFE是默认值。

SAFE 是***限制性的权限集。由具有 SAFE 权限的程序集所执行的代码将无法访问外部系统资源,例如文件、网络、环境变量或注册表。

EXTERNAL_ACCESS 使程序集可以访问某些外部系统资源,例如文件、网络、环境变量以及注册表。UNSAFE 可使程序集不受限制地访问资源,无论是MSSQL实例内部还是外部的资源都可以访问。从 UNSAFE 程序集内运行的代码可调用未托管代码。

创建托管应用程序集的操作也可以在MSSQL Management Studio中手工完成。

创建存储过程

下面是根据创建的托管模块来创建存储过程。

创建PROCEDURE

  1. CREATE PROCEDURE [dbo].[GetHashText]  
  2. @plainText [nvarchar](4000),  
  3. @encryptedText [nvarchar](4000) OUTPUT,  
  4. @hashProvider [int] OUTPUT,  
  5. @saltText [nvarchar](4000) OUTPUT  
  6. WITH EXECUTE AS CALLER  
  7. AS  
  8. EXTERNAL NAME [Wuhong.ClrSp].[StoredProcedures].[GetHashText]  
  9. GO 

 

WITH EXECUTE AS指定执行模块的上下文,可以控制 数据库引擎使用哪一个用户帐户来验证对模块引用的对象的权限。CALLER是默认值。

CALLER指定模块内的语句在模块调用方的上下文中执行。这表示执行模块的用户不仅必须对模块本身拥有适当的权限,还要对模块引用的任何数据库对象拥有适当权限。

OWNER指定模块内的语句在模块的当前所有者上下文中执行。

SELF指定模块内的语句在创建或更改模块的用户的上下文中执行。

‘user_name’指定模块内的语句在user_name指定的用户的上下文中执行。

关于SQL Server数据库中托管代码的使用方法就介绍到这里了,希望本次的介绍能够对您有所收获!

【编辑推荐】

  1. SQL Server数据库中FOR XML AUTO的使用详解续
  2. SQL Server使用UNION代替OR提升查询性能的实例
  3. SQL Server表中数据按条件批量导出为多个Excel文件
  4. Oracle数据库分析函数应用实例之查找状态全为1的ID
  5. Oracle handbook系列之虚拟专用数据库VPD的使用详解

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/268011.html<

(0)
运维的头像运维
上一篇2025-05-06 16:45
下一篇 2025-05-06 16:46

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注