アンマネージアセンブリをロードするためのP/Invokeメソッドを持つ.Netアセンブリ(64ビット環境)があります。.Netアセンブリで使用可能なメソッドをSQLストアドプロシージャに使用したいと思います。これの目的は、SQLで実現された例外とエラーのエラーログを記録することです。
以下は、SQLに含める.Netアセンブリのメソッドです。MyLogger.Logger.LogInfoメソッドは、管理されていないアセンブリをロードするためのP/Invokeメソッドを内部に持つMyLoggerアセンブリで定義されます。
public class SQLLogger
{
[Microsoft.SqlServer.Server.SqlFunction()]
public static void LogInfoMessage(SqlString infoMessage)
{
MyLogger.Logger.LogInfo(infoMessage.ToString());
}
.Netアセンブリを作成し、SQL Server2008R2で以下のクエリを実行しました。
CREATE assembly SQLLogger from 'C:\tmp\SQLLogger.dll' WITH PERMISSION_SET = SAFE
参照先MyLogger.dll
も同じフォルダに保存しましたが、以下の例外が発生します。
安全なアセンブリ「MyLogger」のタイプ「MyLogger.Logger」にpinvokeimplメソッドがあるため、CREATEASSEMBLYが失敗しました。P / Invokeは、安全なアセンブリでは許可されていません。
パーミッションセットの値Unrestricted、External Accessを使用して、SQLでアセンブリを手動で作成しようとしましたが、作成できませんでした。
外部アクセス許可セットと無制限許可セットの手動操作中に、以下のエラーが発生します。
SqlAssembly'SQLLogger'の作成に失敗しました。(Microsoft.SqlServer.Smo)追加情報:
Transact-SQLステートメントまたはバッチの実行中に例外が発生しました。(Microsoft.SqlServer.ConnectionInfo)
アセンブリ'mylogger、version = 1.0.0.0、culture = neutral、publickeytoken=b8f8bb225641c4a3。' SQLカタログに見つかりませんでした。(Microsoft SQL Server、エラー:6503)
関連する投稿がいくつかありますが、私はそれから解決策を得ることができませんでした、
SQLServer2008からのアンマネージC/C++DLL関数の呼び出し
http://social.msdn.microsoft.com/Forums/en-US/sqlnetfx/thread/4a032c4b-1402-4c53-b34e-8c8bd724f904
ご協力いただきありがとうございます!!!