Требование к мастер-ключу для сервисного брокера - PullRequest
4 голосов
/ 09 декабря 2010

Я читал на различных страницах MSDN и в блогах по SQL Server, что «обычно» мастер-ключ требуется в базе данных Service Broker.

Действительно, при попытке получить сообщения я получаю следующее сообщение журнала событий приложения:

Service Broker необходим доступ к мастер-ключ в базе данных 'MDR_REPLICATION_Z. Код ошибки: 26. Главный ключ должен существовать, а Шифрование главного ключа службы требуется.

Что меня смущает, так это то, почему это происходит, когда все мои РАЗГОВОРЫ имеют ENCRYPTION = OFF.

Есть ли способ использовать Service Broker внутри одной базы данных, где ENCYRPTION выключен, без необходимости создания главного ключа базы данных?

Ответы [ 3 ]

3 голосов
/ 11 июня 2013

Альтернативой может быть создание мастер-ключа для сервисного брокера.

Сначала проверьте очередь своего сервисного брокера, щелкнув правой кнопкой мыши по очереди и просмотрев очередь передачи, или просто используйте этот запрос

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]

Если вы найдете здесь какие-либо данные, причина этого будет в столбце translation_status.

Если посредник не играет своей роли, я бы создал NEW_BROKER со следующим запросом

USE [master] 
ALTER DATABASE [DATABASE_NAME] SET NEW_BROKER

Затем включите БРОКЕРА с TRUSTWORTHY, установленным в ВКЛ.

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 и повторить попытку.Это должно работать хорошо !!

3 голосов
/ 09 декабря 2010

С Безопасность диалога Service Broker :

Безопасность диалога Service Broker позволяет ваше приложение использует аутентификацию, авторизация или шифрование для индивидуальный диалог (или диалог). По умолчанию все диалоги разговоры используют диалог безопасности. Когда вы начинаете диалог, вы можете явно разрешить диалог без диалоговой безопасности, включая предложение ENCRYPTION = OFF на НАЧАТЬ ДИАЛОГ ПЕРЕГОВОРА. Однако, если привязка удаленного сервиса существует для службы, которую Цели разговора, диалог использует безопасность, даже если ENCRYPTION = OFF.

Другими словами, убедитесь, что у вас нет соответствующих привязок удаленного сервиса.

0 голосов
/ 09 декабря 2010

Я нашел решение.

Несмотря на то, что целевой сервис, указанный в моем BEGIN DIALOG, содержится в той же базе данных, мне нужно было указать о том, что сервис target был в той же базе данных.

Это делается путем добавления необязательного CURRENT DATABASE при указании целевой службы:

BEGIN DIALOG @dlg_handle 
FROM SERVICE CheckpointAndLogInitiatorService 
TO
SERVICE 'CheckpointAndLogTargetService', 'CURRENT DATABASE'
ON CONTRACT
CheckpointStart_CheckpointStartReply
WITH ENCRYPTION = OFF;
...