SQL Server 2005 Asnyc хранимая процедура - PullRequest
0 голосов
/ 17 января 2010

У меня сейчас проблемы с вызовом асинхронной хранимой процедуры из триггера вставки-обновления. Для этого я использую сервисный брокер.

--message type
CREATE MESSAGE TYPE [TheMessage] VALIDATION = NONE

--contract
CREATE CONTRACT [TheContract] ([TheMessage] SENT BY ANY);

--queue
CREATE QUEUE [TheQueue] WITH ACTIVATION
(STATUS = ON, MAX_QUEUE_READERS = 1,
PROCEDURE_NAME = TheStoreProcedure,
EXECUTE AS OWNER);

--service
CREATE SERVICE [TheService] ON QUEUE [TheQueue] ([TheContract]); 

Внутри триггера:

DECLARE @Handle UNIQUEIDENTIFIER;

BEGIN DIALOG CONVERSATION @Handle
FROM SERVICE [TheService]
TO SERVICE 'TheService'
ON CONTRACT [TheContract]
WITH ENCRYPTION = OFF;

SEND ON CONVERSATION @Handle 
MESSAGE TYPE [TheMessage](N'some data');

В рамках хранимой процедуры:

DECLARE @Handle UNIQUEIDENTIFIER;
DECLARE @MessageType SYSNAME;

RECEIVE TOP (1)
@Handle = conversation_handle,
@MessageType = message_type_name
FROM [TheQueue];

IF(@Handle IS NOT NULL)

BEGIN

-- some statements

END

Эта настройка, похоже, не работает. Триггер не выдает никаких ошибок, поэтому я предполагаю, что сообщение поставлено в очередь. Но прием в хранилище не работает. Ни одно из моих заявлений не выполняется.

Ответы [ 2 ]

2 голосов
/ 17 января 2010
  • Проверьте, не сохраняется ли сообщение в sys.transmission_queue. Столбец Transmission_status должен объяснить, почему сообщение не доставлено.
  • Проверить, находится ли сообщение в очереди: SELECT ... FROM [TheQueue]. Если сообщение есть и процедура не активирована, проверьте состояние очереди is_receive_enabled в sys.service_queues . Если очередь отключена, вы, вероятно, откатили 5 приемов подряд во время тестирования и запустили механизм яд сообщения .
  • Если очередь включена, проверьте состояние мониторов очереди, см. Общие сведения о мониторах очереди .
  • Если сообщение не находится ни в очереди, ни в очереди на передачу, оно должно быть использовано активированной процедурой. Проверьте ваш ERRORLOG для любой ошибки вывода. Отключите активацию, снова отправьте сообщение, затем запустите процедуру вручную из окна запроса SSMS, проверьте, нет ли сообщения об ошибке.
  • Убедитесь, что ваша активированная процедура не попадает в ловушки контекста EXECUTE AS. См. Почему функция… не работает при активации? и Вызов процедуры в другой базе данных из активированной процедуры
0 голосов
/ 23 января 2010

Хорошо, спасибо за ваши ответы, я исправил это.

Проблема заключалась в том, что компонент Service Broker был отключен ..

USE AdventureWorks
GO

ALTER DATABASE AdventureWorks SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE AdventureWorks SET ENABLE_BROKER
ALTER DATABASE AdventureWorks SET MULTI_USER
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...