繁体   English   中英

SQLCLR:如何将程序集Npgsql.dll添加到数据库?

[英]SQLCLR: How to add assembly Npgsql.dll to database?

我想从SQCLR过程执行PostgreSQL命令。 当我添加Mono.Security.dll时,出现错误:

Msg 6218, Level 16, State 2, Line 33
CREATE ASSEMBLY for assembly 'Mono.Security' failed because assembly 'Mono.Security' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message
[ : Mono.Math.BigInteger+Kernel::Multiply][mdToken=0x600005d][offset 0x0000001C][found address of Int32][expected unmanaged pointer] Unexpected type on the stack.
[ : Mono.Math.BigInteger+Kernel::Multiply][mdToken=0x600005d][offset 0x00000039][found address of Int32][expected unmanaged pointer] Unexpected type on the stack.
[ : Mono.Math.BigInteger+Kernel::Multiply][mdToken=0x600005d][offset 0x00000059][found address of Int32][expected unmanaged pointer] Unexpected type on the stack.

是否可以在SQLCLR过程中使用Npgsql?

首先,我将回答上述问题。 但是,第二,它是最有可能不如只是一个链接服务器添加到PostgreSQL和我解决对付SQLCLR错误之后。


SQLCLR信息

如果这完全可以通过SQLCLR进行,则最快/最简单的方法是:

  • ALTER数据库为TRUSTWORTHY ON
  • CREATE ASSEMBLY查询中包含WITH PERMISSION_SET = UNSAFE
  • 如果任何引用的程序集在同一文件夹中,它们将自动上载。 因此,也许尝试从加载Npgsql.dll开始?

现在,这项工作要求您要加载到SQL Server中的所有程序集都是“纯” MSIL程序集。 如果有任何“混合”(包含MSIL和本机C ++),则无法加载它们,您将不得不找到其他解决方案,例如编写可通过xp_cmdshell或其他方式调用的控制台应用程序。

如果上述方法确实有效,则不需要将数据库设置为TRUSTWORTHY ON更好的方法是根据这些程序集中的私钥创建一个非对称密钥(假定它们是强命名的)。


非SQLCLR信息

全部说明:如果可能,创建一个链接到PostgreSQL的链接服务器,然后在常规T-SQL 通过SQLCLR提交的查询中进行链接服务器调用(由于SQLCLR不执行SQL,它仅将其传递给SQL Server像其他任何客户端软件一样)。 这样可以避免使用UNSAFE程序集时可能遇到的一些潜在问题。 以下是有关设置的两个资源:


更新:

如果使用的SQL Server版本是2012或更高版本,则执行CREATE ASSEMBLY时调用的验证过程中的行为实际上可能会稍有变化。 查看确切的错误消息,我们可以看到问题的根源在Mono.Math.BigInteger+Kernel::Multiply 由于Mono项目是开放源代码,因此我们应该能够查看源代码。 我在GitHub上找到了源文件Mono.Security/Mono.Math/BigInteger.cs ,并且在以下位置找到了Kernel类的Multiply方法:

https://github.com/mono/mono/blob/master/mcs/class/Mono.Security/Mono.Math/BigInteger.cs#L2097

签名:

public static unsafe void Multiply (uint [] x, uint xOffset, uint xLen, uint [] y,
                                    uint yOffset, uint yLen, uint [] d, uint dOffset)

以下线程讨论了与Oracle驱动程序相关的非常类似的问题(也出现“堆栈上意外类型”错误),SQL Server是否应该抱怨这一点:

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4e6a5407-7daa-417d-a7ab-2522dc4ee927/sqlclr-create-assembly-validation-in-sql-2012-vs-2008?forum= sqlnetfx

建议将System.Data.OleDB与适当的OLEDB提供程序一起使用。 我在PostgreSQL官方网站的软件目录-驱动程序和接口页面中找到以下两个选项:

  • PGNP :它似乎没有免费版本,但确实有试用版。
  • PgOleDb :免费,但自2006-04-17以来似乎未更新。

另一个选择是通过System.Data.Odbc和ODBC提供程序使用ODBC。 我在同一个PostgreSQL.com页面上找到了以下两个选项:

  • psqlODBC :官方的PostgreSQL ODBC驱动程序。 截至2015年8月16日,此驱动程序的最新更新于2014-10-26。

  • PostgreSQL的ODBC驱动程序 :似乎没有免费版本,但是它们确实有30天的试用版。

OLEDB和ODBC选项都应在SQLCLR和链接服务器中均起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM