3

SQL Server2008に統合されたclrストアドプロシージャを使用して、単純なmsmqメッセージングアプリケーションを作成しようとしています。

以下の手順に従ってください

  1. defualtによってSystem.MessagingリファレンスはSQLサーバーで利用できないため、このアセンブリを作成しました

    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サーバーアプリケーション

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);
                }
            }
         }     
     }
  1. そのアセンブリをSQLサーバーに登録し 、「E:\ CCA Parctise\SqlMSMQ.dll」からアセンブリMSMQAppを作成します。

SqlMSMQ.dllは、SQLサーバーアプリケーションdllです。

  1. ストアドプロシージャ の作成createPROCEDURE[dbo]。[Proc_Send_Queue](@queue nvarchar、@msg nvarchar)WITH EXECUTE AS CALLER AS EXTERNALNAME[MSMQApp]。[CLRProcedure.StoredProcedure]。[Proc_Send_Queue]
  2. ストアドプロシージャの実行中 USE[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"の実行中に.NETFrameworkエラーが発生しました:System.Security.SecurityException:そのアセンブリは部分的に信頼された呼び出し元を許可しません。System.Security.SecurityException:CLRProcedure.StoredProcedure.Proc_Send_Queue(SqlString queue、SqlString msg)で

これを解決するためにあなたの助けに感謝します。

前もって感謝します

4

1 に答える 1

2

部分的に信頼された呼び出し元の状態を許可する:

グローバル アセンブリ キャッシュに追加されたアセンブリを除き、SQL Server に登録されているすべてのアセンブリを AllowPartiallyTrustedCallers 属性でマークして、SQL Server によって読み込まれたアセンブリが相互にアクセスできるようにすることをお勧めします。

推奨事項に記載されているとおりに実行したため、エラーが発生しました。どうしたの?厳密な名前付きアセンブリと AllowPartiallyTrustedCallersを参照してください 。

アセンブリ B が厳密な名前のアセンブリ A を呼び出すと、

A に AllowPartiallyTrustedCallers 属性が必要か、B に安全でない (FullTrust) アクセス許可が設定されている必要があります。

あなたの場合、「B」はSqlMSMQ.dllであり、厳密な名前の「A」はSystem.Messaging.dllです。「A」を変更して APTC 属性を持たせることはできないため、唯一の解決策は「B」を完全に信頼できるように変更することです (つまり、UNSAFE)。

 create assembly MSMQApp from 'E:\CCA Parctise\SqlMSMQ.dll'
   with permission_set = unsafe;

メッセージの受信者は? SQL Server によってサポートされている別のアプリケーションである場合は、Service Brokerにはるかに優れた代替手段があります。

于 2012-08-08T07:58:01.743 に答える