5

さまざまな MSDN ページと SQL Server ブログを読みましたが、"通常" Service Broker データベースにはマスター キーが必要です。

実際、メッセージを受信しようとすると、次のアプリケーション イベント ログ メッセージが表示されます。

Service Broker は、データベース 'MDR_REPLICATION_Z' のマスター キーにアクセスする必要があります。エラーコード:26。マスター キーが存在する必要があり、サービス マスター キーの暗号化が必要です。

私を混乱させているのは、すべての CONVERSATION で ENCRYPTION = OFF が設定されているのに、なぜこれが起こっているのかということです。

データベース マスター キーを作成せずに、ENCYRPTION が OFF の単一データベース内で Service Broker を内部的に利用する方法はありますか?

4

3 に答える 3

4

Service Broker Dialog Securityから:

Service Broker ダイアログ セキュリティを使用すると、アプリケーションで個々のダイアログ カンバセーション (またはダイアログ) に対して認証、承認、または暗号化を使用できます。デフォルトでは、すべてのダイアログ会話でダイアログ セキュリティが使用されます。ダイアログを開始するときに、BEGIN DIALOG CONVERSATION ステートメントに ENCRYPTION = OFF 句を含めることにより、ダイアログ セキュリティを使用せずにダイアログを続行することを明示的に許可できます。ただし、会話の対象となるサービスにリモート サービス バインディングが存在する場合、ダイアログは ENCRYPTION = OFF の場合でもセキュリティを使用します。

つまり、一致するリモート サービス バインディングがないことを確認してください。

于 2010-12-08T23:56:03.173 に答える
4

別の方法は、サービス ブローカーのマスター キーを作成することです。

まず、キューを右クリックして送信キューを表示するか、単にこのクエリを使用して、Service Broker キューを確認します

SELECT  *, casted_message_body = CASE message_type_name WHEN 'X' 
    THEN CAST(message_body AS NVARCHAR(MAX)) 
    ELSE message_body 
END 
FROM [DATABASE_NAME].[sys].[transmission_queue]

ここにデータが見つかった場合、transmission_status 列にその理由が示されます。

ブローカーがその役割を果たしていない場合は、次のクエリで NEW_BROKER を作成します

USE [master] 
ALTER DATABASE [DATABASE_NAME] SET NEW_BROKER

次に、TRUSTWORTHY を ON に設定して BROKER を有効にします。

ALTER DATABASE DATABASE_NAME SET ENABLE_BROKER;
ALTER DATABASE DATABASE_NAME SET TRUSTWORTHY ON;

最後に、マスター キーを削除し、新しいマスター キーを作成して新しいパスワードで暗号化します。

ALTER AUTHORIZATION ON DATABASE::DATABASE_NAME TO [SA];
DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '79HGKJ67ghjgk^&*^fgj'
GO

パスワードは、ユーザーが定義した英数字と記号の組み合わせにすることができます。

上記の手順のいずれかの実行に時間がかかる場合は、クエリを停止して SQL マネージャーを再度開き、もう一度やり直すことをお勧めします。うまくいくはずです!!

于 2013-06-11T11:59:51.470 に答える
3

解決策を見つけました。

BEGIN DIALOG で指定したターゲット サービスが同じデータベースに含まれていても、ターゲットサービスが同じデータベース内にあるという事実を明示する必要がありました。

CURRENT DATABASEこれは、ターゲット サービスを指定するときにオプションを追加することによって行われます。

BEGIN DIALOG @dlg_handle 
FROM SERVICE CheckpointAndLogInitiatorService 
TO
SERVICE 'CheckpointAndLogTargetService', 'CURRENT DATABASE'
ON CONTRACT
CheckpointStart_CheckpointStartReply
WITH ENCRYPTION = OFF;
于 2010-12-09T14:00:56.633 に答える