Sql Server 添加外部程序集基本操作

简介:有时候Sql
Server的放开函数没有那好用的时刻,可以引用一下表程序集,下面献下丑,做下上加外部程序集操作

1、准备程序,编译出一个MyCLR的DLL.

 

public class CLRClass
    {
        [Microsoft.SqlServer.Server.SqlFunction]
        public static int MyFun(int a, int b)   //必须使用静态方法,非静态方法会报错。
        {
            return a <= b ? a : b; //其实就是一个判断最小值函数
        }

    } 

 

 

2、添加程序集。

CREATE ASSEMBLY MyClr1
    FROM 'I:\Test\MyClr\MyClr\bin\Release\MyClr.dll' 
        WITH permission_set = Safe/EXTERNAL ACCESS/UnSafe; -- (默认推荐/可以访问外部资源/不受限制地访问资源)

 

于以 SAFE 或 EXTERNAL ACCESS 权限集创建的次集:

  • 次集代码应是路安全之。通过对程序集运行公共语言运行时证实器而建项目安全。
     
  • 程序集的接近吃未承诺涵盖其他静态数据成员,除非这些分子标记为只读。
  • 先后集中之近乎不可知包含终结器方法。

  UNSAFE 模式是无深受其他限制的拜访资源。

及时是齐手册上面对就几乎种模式之限量。

 

假定发静态变量,在Safe 模式下虽见面报错了

 public class CLRClass
    {
        static int i = 0;
        [Microsoft.SqlServer.Server.SqlFunction]
        public static int MyFun(int a, int b)   //必须使用静态方法,非静态方法。
        {
            i += 1;
            return a <= b ? a : b;
        }

 

 

然后以数据库执行 

ALTER ASSEMBLY MyClr1
FROM 'I:\Test\MyClr\MyClr\bin\Release\MyClr.dll' WITH permission_set = Safe;

 

叮叮,立即中奖

图片 1

 

缓解方法。去丢静态变量,将静态变量改吧ReadOnly模式,或者用顺序集转吗
UNSAFE模式。

去丢静态变量和ReadOnly就不说了。

反也UNSAFE模式,可以尽以下语句

ALTER DATABASE TestDB set TRUSTWORTHY ON;     --
数据库所有者(DBO)拥有 UNSAFE ASSEMBLY 权限,且数据库具有 TRUSTWORTHY 数据库属性;或者,程序集已使用其对应登录名具有 UNSAFE ASSEMBLY 权限的证书或非对称密钥加以签名
 go
ALTER ASSEMBLY MyClr1
FROM 'I:\Test\MyClr\MyClr\bin\Release\MyClr.dll' WITH permission_set = UNSAFE;
go

--执行成功

 

创立了程序集,然后上加个函数映射来利用

添加函数映射
CREATE function ClrFBitContains
( @a as INT , @b as int )
returns INT
as
  EXTERNAL NAME MyClr1.CLRClass.MyFun


确认是否需要打开CLR执行权限
exec sp_configure 'clr enabled', '1'
reconfigure


SELECT dbo.ClrFBitContains(1,3)

PS:每次修改完动态库,需要重新执行修改一次程序集定义才能更新同步上去
CREATE ASSEMBLY MyClr1
    FROM 'I:\Test\MyClr\MyClr\bin\Release\MyClr.dll' 

 

 

好~搞掂

 

相关文章