2010-01-17 2 views
0

В настоящее время у меня возникают проблемы с вызовом async хранимой процедуры из триггера insert-update. Для этого я использую сервис-брокер.SQL Server 2005 Asnyc хранимая процедура

--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 

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

ответ

0

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

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

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 
2
  • Проверьте, не сохраняется ли сообщение в sys.transmission_queue. Столбец Transmission_status должен объяснить, почему сообщение не доставлено.
  • Проверьте, присутствует ли сообщение в очереди: SELECT ... FROM [TheQueue]. Если сообщение есть, и процедура не активировала, проверьте статус is_receive_enabled очереди в sys.service_queues. Если очередь отключена, вы, вероятно, откат назад 5 получает подряд во время тестирования и запускает poison message mechanism.
  • Если очередь включена, проверьте состояние мониторов очереди, см. Understanding Queue Monitors.
  • Если сообщение не находится ни в очереди, ни в очереди передачи, оно должно быть уничтожено активированной процедурой. Проверьте ERRORLOG на наличие ошибок. Отключите активацию, отправьте сообщение еще раз, затем запустите процедуру вручную из окна запроса SSMS, посмотрите, появляется ли сообщение об ошибке.
  • Убедитесь, что активированная процедура не попадает в ловушки контекста EXECUTE AS. См. Why does feature … not work under activation? и Call a procedure in another database from an activated procedure