SQL CLR学习

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 被雜湊後的值。
时间: 2024-10-28 10:52:29

SQL CLR学习的相关文章

SQL的学习

SQL的学习之路,主要参考资料是: SQL必知必会 W3school的SQL简介 操作使用的数据库为Access及MySQL. 数据采用的是SQL必知必会中的数据(最下方可以下载数据).其有5个表,表的关系如下: 看不清的图片:右击新标签页打开即可. 1.SQL基础 2.检索数据 3.排序检索数据 4.过滤数据 5.高级过滤 6.通配符过滤 7.创建计算字段 8.函数特性 9.函数   10.汇总数据 11.分组数据 以上测试均在Access数据库中进行,以下于MySQL中进行,通过workbe

SQL server学习

慕课网sql server学习 数据库第一印象:desktop--web server--database server** 几大数据库:sql server.oracle database.DB2.MySql.MongoDB.....(SQL结构性查询语言) 安装软件:SQL Server Management Studio 附加.分离(attach.detach)数据库文件: 数据库图表关系图: 关系型数据库: 二维表.主键.外键 T-SQL简介: T-SQL query--从数据库中查询索

sql CLR

1.什么是SQLCLR SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Server 中,使得.NET代码可在SQL Server服务器进程中执行. 通过在 Microsoft SQL Server 中托管 CLR(称为 CLR 集成),开发人员可以在托管代码中编写存储过程.触发器.用户定义函数.用户定义类型和用户定义聚合函数, 改变了以前只能通过T-S

SQL 语句学习

Sql语句学习 一. select playerId, count(playerId) as num from OperateLog_$i where playerId > 0 and rootId = 12 and typeId = 12156 and actionTime >= 1381509000000 and actionTime <= 1381511220000 group by playerId having count(*) > 2; this-- > 可以计算

SQL触发器学习

? 简介 触发器是一种特殊类型的存储过程.触发器分为: DML( 数据操纵语言 Data Manipulation Language)触发器:数据库中表或视图的数据更改时触发,包括insert,update,delete语句 DDL(数据定义语言 Data Definition Language)触发器:表或索引中的create.alter.drop语句. 登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发. ? 优劣 可以强制执行业务规则: Microsoft SQL Serve

mysql学习之三:sql语句学习

SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统.SQL 语句用于取回和更新数据库中的数据.SQL 可与数据库程序协同工作,比如MySQL. MS Access.DB2.Informix.MS SQL Server.Oracle.Sybase 以及其他数据库系统. 不幸地是,存在着很多不同版本的 SQL 语言,但是为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(比如 SELECT.UPDATE.DELETE.INSERT.WHERE 等等).

mysql学习之四:sql语句学习2

创建数据库: CREATE DATABASE stefan; 删除数据库: DROP DATABASE stefan; 重命名数据库: 重命名数据库没有直接的办法. 已经不再使用的方法: RENAME DATABASE stefan TO LCDB; 创建表格语法: CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... )   查看一个表格结构: DESCRIBE Persons;     ALTER TABLE 语句用于在已有的表中添

mysql学习之五:sql语句学习3

好吧,大家觉得这种字体还是比较好看,所有我们就换这种字体了. INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2,....) 我们也可以指定所要插入数据的列: INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 DELETE 语句用于删除表中

sql语句学习

select top 1 id from AddWorkFlow order by id desc返回查询结果中前几条数据 select count(1) as total from Base_Users where DeptId='101010102' and iDel=0返回查询的记录个数 select max(UserId) as total from Base_Users where DeptId='101010102' and iDel=0返回查询内容的最大值或最大长度 select