【问题标题】:Using a CREATEd ASSEMBLY causes SQL Server to hang permanently使用 CREATed ASSEMBLY 会导致 SQL Server 永久挂起
【发布时间】:2011-07-25 21:18:07
【问题描述】:

这个有点难解释,尤其是对于非英语母语的人:

我想使用BouncyCastle crypto library 的 C# 实现的一些基于椭圆曲线的数字签名函数。我写了一个小的 C# 包装类,它有以下方法:

public static void generateKeyPair(out byte[] private_key, out byte[] public_key)

public static void SignData(byte[] data, byte[] private_key, out byte[] signature)

public static void VerifyData(byte[] signature, byte[] data, byte[] public_key, out bool ok)

它们都可以访问实际的 BouncyCastle 库 BouncyCastle.Crypto.dll。然后我 创建了一个“Visual Studio 强名称密钥文件”,并使用原始 BouncyCastle DLL 作为资源和刚刚创建的密钥文件编译了包装类文件。

在 SQL Server 中,我执行了以下操作:

USE ACS  
EXEC sp_configure 'show advanced options', 1;  
RECONFIGURE WITH OVERRIDE;  
EXEC sp_configure 'xp_cmdshell', 1  
EXEC sp_configure 'CLR enabled', 1;  
RECONFIGURE WITH OVERRIDE;  
ALTER DATABASE ACS SET TRUSTWORTHY OFF  

USE master  
CREATE ASYMMETRIC KEY CLR_Key_Wrapper FROM EXECUTABLE FILE = 'C:\Wrapper.dll'  
CREATE ASYMMETRIC KEY CLR_Key_BouncyCastle FROM EXECUTABLE FILE = 'C:\BouncyCastle.Crypto.dll'  
CREATE LOGIN CLR_Login_Wrapper FROM ASYMMETRIC KEY CLR_Key_Wrapper  
CREATE LOGIN CLR_Login_BouncyCastle FROM ASYMMETRIC KEY CLR_Key_BouncyCastle  
GRANT UNSAFE ASSEMBLY TO CLR_Login_Wrapper  
GRANT UNSAFE ASSEMBLY TO CLR_Login_BouncyCastle  

USE ACS  
CREATE ASSEMBLY CLR FROM 'C:\Wrapper.dll' WITH PERMISSION_SET = UNSAFE  
GO

CREATE PROCEDURE Generate_Keypair  
(  
  @BSI_or_NIST  BIT,  
  @Private_Key  VARBINARY(64)  OUTPUT,  
  @Public_Key  VARBINARY(128)  OUTPUT  
)  
AS EXTERNAL NAME CLR.Wrapper.generateKeyPair  
GO  

CREATE PROCEDURE Sign_Data  
(  
  @BSI_or_NIST  BIT,  
  @Data  VARBINARY(8000),  
  @Private_Key  VARBINARY(64),  
  @Signature  VARBINARY(128)  OUTPUT  
)  
AS EXTERNAL NAME CLR.Wrapper.SignData  
GO  

CREATE PROCEDURE Verify_Data  
(  
  @BSI_or_NIST  BIT,  
  @Signature  VARBINARY(128),  
  @Data  VARBINARY(8000),  
  @Public_Key  VARBINARY(128),  
  @OK  BIT  OUTPUT  
)  
AS EXTERNAL NAME CLR.Wrapper.VerifyData  

现在,使用 TSQL 批处理中的三个过程 Generate_Keypair、Sign_Data 和 Verify_Data 或通过来自例如.Net 客户端应用程序有时可以正常工作,但有时它会导致 MSSQLSERVER 服务在使用 100% CPU 时进入类似死循环的状态,尤其是当我尝试将所有这些安装在与我开发代码的机器不同的机器上时上面(尽管如此,在我自己的机器上也会发生,但频率较低)。

唯一可以做的就是取消正在执行的查询并删除程序集,这在 CPU 处于 100% 使用率时需要很长时间。

谁能告诉我我做错了什么?提前致谢,
一月

【问题讨论】:

    标签: sql-server dll clr sqlclr


    【解决方案1】:

    您的存储过程声明了一个 C# 方法缺少的 BIT 参数。

    要确定您的程序集是否导致 100% 的 CPU 使用率,您应该在代码执行时记录,并检查生成的日志文件(log4net、BareTail)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多