我正在尝试使用集成在 sql server 2008 中的 clr 存储过程创建一个简单的 msmq 消息传递应用程序。
遵循以下步骤
通过默认的 System.Messaging 引用在 sql server 中不可用,因此创建了这个程序集
ALTER DATABASE [AdventureWorksLT2008] SET TRUSTWORTHY on create ASSEMBLY Messaging AUTHORIZATION dbo FROM 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS GO
2.创建带有存储过程的sql server应用程序
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
using System.Messaging;
using System.Security;
[assembly: AllowPartiallyTrustedCallers]
namespace CLRProcedure
{
public class StoredProcedure
{
/// <summary>
/// Sends message to queue
/// </summary>
/// <param name="queue">Queue path</param>
/// <param name="msg">Message</param>
[SqlProcedure]
public static void Proc_Send_Queue(SqlString queue, SqlString msg)
{
using (MessageQueue msgQueue = new MessageQueue(queue.ToString(), QueueAccessMode.Send))
{
msgQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
msgQueue.Send(msg.Value);
}
}
}
}
- 在 sql server 中注册该程序 集 从“E:\CCA Parctise\SqlMSMQ.dll”创建程序集 MSMQApp
SqlMSMQ.dll 是 sql server 应用程序 dll。
- 创建存储过程 create PROCEDURE [dbo].[Proc_Send_Queue] (@queue nvarchar, @msg nvarchar) WITH EXECUTE AS CALLER AS EXTERNAL NAME [MSMQApp].[CLRProcedure.StoredProcedure].[Proc_Send_Queue]
在执行存储过程时 使用 [AdventureWorksLT2008] GO DECLARE @return_value int EXEC @return_value = [dbo].[Proc_Send_Queue] @queue = N'SampleQ', --msmq name @msg = N'Simpel queue message' -- message SELECT'返回值' = @return_value GO
抛出错误
消息 6522,级别 16,状态 1,过程 Proc_Send_Queue,第 0 行在执行用户定义的例程或聚合“Proc_Send_Queue”期间发生 .NET Framework 错误:System.Security.SecurityException:该程序集不允许部分受信任的调用者。System.Security.SecurityException:在 CLRProcedure.StoredProcedure.Proc_Send_Queue(SqlString 队列,SqlString 消息)
感谢您帮助解决这个问题。
提前致谢