SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Server 中,让 SQL Server 的部分数据库对象可以使用 .NET Framework 的编程语言开发(目前只支持VB.NETC#),包括预存程序用户自定义函数触发程序用户自定义类型以及用户自定义汇总函数等功能[1]

架构

SQL CLR 是利用 .NET Framework 中的 Hosting(装载) 特性所实现的版本,这个功能让 SQL Server 中可以安装 .NET Framework 的组件,经由实现 ADO.NET 2.0 中所开放的 Microsoft.SqlServer.Server 名字空间中的.NET中介数据,来获得 SQL Server 数据库对象的能力:

  • 预存程序:SqlProcedureAttribute
  • 用户函数:SqlFunctionAttribute
  • 触发程序:SqlTriggerAttribute
  • 用户自定义汇总:SqlUserDefinedAggregate
  • 用户自定义类型:SqlUserDefinedType

SQL CLR 的组件在发展完成后,需要使用 CREATE ASSEMBLY 指令将组件安装到 SQL Server 中,然后使用相对应的 DDL 指令将组件中开放的函数引入数据库对象中,才能在 SQL 指令中调用。

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = SAFE

安全性

对于 SQL Server 来说,SQL CLR 组件是一种外部代码,所以在 SQL Server 默认的安装配置中,SQL CLR 是被封锁不可以使用的,若要使用它,必须要先将它打开[2]

EXEC sp_configure 'clr enabled', 1;

而对于 SQL CLR 组件本身,SQL Server 也做了三重的防护[3]

  • SAFE:只有最少的权限可以运行,不可访问外部资源与外部代码。
  • EXTERNAL_ACCESS:可以访问外部资源,像是文件、登录数据库、网络资源等。
  • UNSAFE:可以无限制的访问外部资源,连 Win32 API 等都可以调用。

在大多数的情况来说,使用 SAFE 即可以正常使用组件,除非是要访问外部文件才使用 EXTERNAL_ACCESS,只有在特殊的情况下(例如要调用外部的商业逻辑组件)时,才会激活 UNSAFE 层次。

示例

下列示例为使用 C# 开发 SQL Server 用户函数的代码:

[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString HashPasswordString(SqlString HashString)
{
SHA384Managed hashAlgorithm = new SHA384Managed();
byte[] srcPassword = System.Text.Encoding.ASCII.GetBytes(HashString.Value);
byte[] destPassword = null;
string hashedPasswordString = null; destPassword = hashAlgorithm.ComputeHash(srcPassword);
hashedPasswordString = System.Text.Encoding.ASCII.GetString(destPassword); hashAlgorithm = null;
return new SqlString(hashedPasswordString);
}

将组件安装到 SQL Server 的脚本为:

CREATE ASSEMBLY MyAssemblyLibrary FROM 'MySQLCLR.dll' WITH PERMISSION_SET = SAFE

将此函数引入 SQL Server 中的 DDL 脚本为:

CREATE FUNCTION dbo.HashPassword
(
@PasswordString VARCHAR(4000)
)
RETURNS VARCHAR(4000)
EXTERNAL NAME [MyAssemblyLibrary]。[MySQLCLR]。[HashPasswordString]

安装并引入后,即可如一般的 SQL 函数方式使用:

SELECT dbo.HashPassword('mypassword') -- 回傳 mypassword 被雜湊後的值。

SQL CLR学习的更多相关文章

  1. SQL server学习

    慕课网sql server学习 数据库第一印象:desktop--web server--database server** 几大数据库:sql server.oracle database.DB2. ...

  2. SQL语句学习手册实例版

    SQL语句学习手册实例版 表操作 例1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, ...

  3. SQL索引学习-聚集索引

    这篇接着我们的索引学习系列,这次主要来分享一些有关聚集索引的问题.上一篇SQL索引学习-索引结构主要是从一些基础概念上给大家分享了我的理解,没有实例,有朋友就提到了聚集索引的问题,这里列出来一下: 其 ...

  4. Oracle SQL 基础学习

    oracel sql 基础学习 CREATE TABLE USERINFO ( ID ,) PRIMARY KEY, USERNAME ), USERPWD ), EMAIL ), REDATE DA ...

  5. SQL菜鸟学习札记(一)

    刚开始学SQL,从最基础的语句开始写,用一个LOL数据库做实验.目前使用的工具是MySQL Workbench,感觉比较顺手,界面没花多久时间就读懂的差不多了,所以目前就使用这个工具来做SQL的学习了 ...

  6. SQL server学习(三)T-SQL编程、逻辑控制语句和安全模式

    T-SQL编程 T-SQL编程与C语言类似,只是语法稍有不同而已,总体思想还是没有变化的.多的就不说了,还是从变量开始. 变量也分为全局变量和局部变量,表示方式稍有不同. 局部变量: 局部变量必须以标 ...

  7. SQL Server Assembly (SQL CLR) 还原数据库后的问题

    最近弄项目迁移的时候遇到还原数据库(SQL Server 2008)后遇到的一个问题: 消息 10314,级别 16,状态 11,第 1 行 在尝试加载程序集 ID 65536 时 Microsoft ...

  8. SQL Server 学习博客分享列表(应用式学习 + 深入理解)

    SQL Server 学习博客分享列表(应用式学习 + 深入理解) 转自:https://blog.csdn.net/tianjing0805/article/details/75047574 SQL ...

  9. SQL 基础学习(2) Joining 和function , 作业没有做,需要看百宝箱。NOsql的概念

    SQL 基础学习(2) Joining 可以同时关联(joining)多张表进行复杂的查询. 相比于用Rails捞出数据再用Ruby进行过滤组合,使用SQL更加高效,节能. 以下是 users has ...

随机推荐

  1. 如何在公司Http代理后使用NuGet官方源

    文章转自CSDN 霍力强的专栏 有些公司上网使用的是Http代理.默认情况下,VS是无法访问外部网络的.如果要使用NuGet,通常只能在局域网里架一个自己的NuGet服务器.但这种方法不论是packa ...

  2. MATLAB的一些应用--最近用的比较多

    MATLAB的一些应用--最近用的比较多 1.MATLAB分析信号的频谱 快速Fourier变换(FFT)是离散傅里叶变换的快速算法,他是根据离散傅里叶变换的奇.偶.虚.实等特性,对离散傅里叶变换的算 ...

  3. 开源的UML建模工具

    StarUML 一个开源的UML建模工具 地址:http://staruml.sourceforge.net/en/ 效果图: 出处:http://www.cnblogs.com/zzy0471/ar ...

  4. c#联网判断

    引用命名空间:sing System.Net.NetworkInformation; var address = "www.baidu.com"; Ping ping = null ...

  5. Kreyos 资料收集

    Kreyos 资料收集 使用 默认需要连接 APP 解锁. 固件 https://github.com/kreyosopensource/KreyosFirmware Android 源码 https ...

  6. the road of test

    1.firefox打印兼容问题: <HTML> <HEAD> <TITLE>JavaScript利用IE内置打印控件IEWebBrowser进行打印/打印页面设置/ ...

  7. C++ 中的 new/delete 和 new[]/delete[]

    在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗? new [] 和 delete [] 又是什么?什么时候 ...

  8. MVC 控制器之间传值学习——session

    刚接触MVC不久,写的一些代码自己都不忍心看下去.路漫漫其修远兮,宝宝还需努力!之前只用过Session做登录时用户信息的储存,今天对集合类数据做了小小的尝试:利用session在控制器之间传值,以减 ...

  9. CAN总线远程帧和错误帧

    远程帧 通常,数据传输是由数据源节点(例如,传感器发出数据帧)自主完成的.但也可能存在目标节点向源节点请求发送数据的情况.要做到这一点,目标节点需发送一个远程帧,其中的标识符应与所需数据帧的标识符相匹 ...

  10. java中求利息的代码

    总结:函数的重要性,懂得用哪一种函数 package com.badu; import java.util.Scanner; //输入存款金额 money.存期 year 和年利率 rate, //根 ...