MSSQL添加程序集并调用方法

需求是数据库中有些字段数据加密了,迁移数据需要将数据解密,解密方式是用.net完成的,所以让mssql调用程序集来解决问题。

1.将.net解密类编译一个dll文件,代码如下:

namespace DecodeCLR
{
  public class CLRClass
    {
        [Microsoft.SqlServer.Server.SqlMethod]
        public static string Decode(string source_str)
        {
            return Utils.Decode(source_str);
        }
    }
}

 

2.添加程序集

EXEC sp_configure 'show advanced options','1'; 
GO 
RECONFIGURE; 
GO 
EXEC sp_configure 'clr enabled','1' 
RECONFIGURE; 
GO 

ALTER DATABASE [DATABASE] SET TRUSTWORTHY ON 
GO 

--将dll文件添加到信任白名单
DECLARE @hash AS BINARY(64) = (SELECT HASHBYTES('SHA2_512', (SELECT * FROM OPENROWSET (BULK 'dll文件物理路径', SINGLE_BLOB) AS [Data])))
EXEC sp_add_trusted_assembly @hash
go

--创建程序集,【SQL_CLR_Decode】是创建的程序集名称,可以自定义
CREATE ASSEMBLY SQL_CLR_Decode
FROM 'dll文件物理路径' 
WITH PERMISSION_SET = unSAFE 
GO

添加成功可以看到当前数据库——可编程性——程序集下多了一个名为SQL_CLR_Decode的程序集

   如果程序集之前删除过,再添加时可能会报错,提示在"master数据库中记录的数据库所有者SID与数据库所有者SID不同。您应该通过使用ALTER AUTHORIZATION语句重置数据",可以执行下面脚本重置数据库:

--DATABASE为需要重置的数据库名称
DECLARE @Command VARCHAR(MAX) = 'ALTER AUTHORIZATION ON DATABASE::[DATABASE] TO 
[sa]' 

SELECT @Command = REPLACE(REPLACE(@Command 
            , 'DATABASE', SD.Name)
            , 'sa', SL.Name)
FROM master..sysdatabases SD 
JOIN master..syslogins SL ON  SD.SID = SL.SID
WHERE  SD.Name = DB_NAME()

PRINT @Command
EXEC(@Command)

 

  

3.调用程序集,创建一个标量值函数,在函数里调用程序集

--方法传入传出参数数量与类型须和程序集中调用方法相同
CREATE FUNCTION SqlDecode(@source_str NVARCHAR(4000)) 
RETURNS NVARCHAR(4000) 
AS 
--SQL_CLR_Decode是创建的程序集名称,DecodeCLR是程序集中命名空间的名称,CLRClass是类名,Decode是要调用的程序集中的方法名
EXTERNAL NAME SQL_CLR_Decode.[DecodeCLR.CLRClass].Decode 
GO   

 

4.使用程序集的时候直接调用方法即可看到结果

select dbo.SqlDecode('1Y3C1Y3Y')

 

posted @ 2022-10-11 09:39  Name=DIC  阅读(144)  评论(0编辑  收藏  举报