在将应用程序迁移到64位SQL Server实例的过程中,遇到了一个常见的问题:32位DLL无法在64位环境中加载。这导致之前使用的Rijndael.dll无法继续使用,而这个DLL是用来通过xp_OA创建的扩展存储过程来加密和解密字符串的。由于不能将数据以这种组件和算法加密后的形式留在数据库中,也不能逆向工程这个组件,因此需要寻找替代方案。
在CLR程序集(SQL Server项目)中,不能使用任何外部DLL,除非它是.NET Framework的一部分。这意味着不能直接引用任何外部程序集。只能通过asmx Web服务和WCF服务来获取外部组件的服务。因此,编写了一个CLR程序集和一个asmx Web服务来解决这个问题。
首先,创建一个Web服务,并在其中添加对COM组件的引用,然后公开Web方法。接着,创建一个新的数据库项目。
为了使程序集能够访问Web服务(这是一个外部组件),需要将程序集的XML序列化设置为true。
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void EncryptString(string plainString)
{
// 在这里放置Web服务访问代码
}
[Microsoft.SqlServer.Server.SqlProcedure]
public static void DecryptString(string encryptedString)
{
// 在这里放置Web服务访问代码
}
}
现在,构建SQL Server项目。
首先,需要通过执行以下SQL命令来启用数据库的CLR:
EXEC sp_configure 'show advanced options', '1';
GO
RECONFIGURE;
GO
EXEC sp_configure 'clr enabled', '1';
GO
RECONFIGURE;
GO
然后,需要将数据库设置为TRUSTWORTHY:
ALTER DATABASE <DB Name> SET TRUSTWORTHY ON;
要部署CLR程序集,打开SQL Server管理工作室,选择想要部署的数据库,然后运行创建程序集的命令。首先部署SqlServerProject1.dll程序集。
CREATE ASSEMBLY SqlServerProject1
FROM 'C:\Documents and Settings\My Documents\Visual Studio 2008\Projects\CLRWebS\SqlServerProject1\bin\SqlServerProject1.dll'
WITH PERMISSION_SET = EXTERNAL;
然后部署序列化程序集SqlServerProject1.XmlSerializers.dll。
CREATE ASSEMBLY SqlServerProject1xml
FROM 'C:\Documents and Settings\My Documents\Visual Studio 2008\Projects\CLRWebS\SqlServerProject1\bin\SqlServerProject1.XmlSerializers.dll'
WITH PERMISSION_SET = SAFE;
部署CLR后,两个存储过程将被列出,现在可以轻松地进行测试。