2011-12-25 5 views
2

Я хотел бы отобразить информацию о ходе работы для пользователя во время работы хранимой процедуры (несколько настроек). Весь код sql заключен в транзакции, поэтому я использую сервис-брокер для получения обновлений в реальном времени. Не могли бы вы подсказать, что не так с кодом ниже, поскольку я не получаю никаких сообщений в моей очереди?
Есть ли лучший способ сделать это?Выполнение транзакции Sql в транзакции

--queue 
create queue myQueue 

--service 
create service myLogs 
on queue myQueue ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]); 

--log handler 
create event notification myLogHandler 
on server 
for userconfigurable_0 
to service 'myLogs', 'current database' ; 

--message 
EXEC master..sp_trace_generateevent @event_class = 82, @userinfo = N'test msg' 

---transaction test 
begin transaction 
EXEC master..sp_trace_generateevent @event_class = 82, @userinfo = N'tran test msg' 
rollback transaction 


--receive message 
declare @message_body xml; 
receive top (1) @message_body = message_body 
from myQueue 
select @message_body 

--display queue 
select * from myQueue 

ответ

1

Это работает отлично для меня, хотя мне нужно было подождать несколько минут и снова запустить прием из очереди, прежде чем я увижу что-нибудь.

Возможно, вам понадобится ENABLE_BROKER в базе данных.

ALTER DATABASE YourDB SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE 

(Предупреждение: Будет ли убить существующих подключений к БД)

+0

Спасибо, я двигался от одного дБ к другому, и я пропустил это :) – witpo

+0

Я пытаюсь переместить код выше (с помощью enable_broker) на свой тестовый сервер (стандарт SQL2008R2). Если я создаю новую базу данных, все будет в порядке. Но я не могу заставить его работать над уже существующим db. Я использую учетную запись sa, поэтому привилегии не должны быть проблемой. Основными отличиями являются уровень сопоставления и совместимости (2005 против 2008). Я изменил уровень совместимости - никакой разницы. Какие-либо предложения? – witpo

+0

Ничего не могу придумать. Предположительно, 'ENABLE_BROKER' определенно установлен? Можете ли вы видеть, как настраиваемое пользователем событие запускается при использовании Profiler? Если да, то оба могут попытаться сбросить все объекты и снова создать. –

3

An возможно более простой способ будет заключаться в следующем:

-------------------------------- 
--Worker process 
-------------------------------- 

BEGIN TRANSACTION 

--While in your loop or at each stage of the proc you can do this 
INSERT INTO MyLoggingTable VALUES('My Message') 

COMMIT 

-------------------------------- 
--Reporting process 
-------------------------------- 

SELECT * FROM MyLoggingTable WITH (NOLOCK) 

NOLOCK позволяет читать прогресс ргос даже хотя его регистрация в нем внутри транзакции.

Учтите, что это позволяет вам читать данные «LIVE», но если рабочий процесс дозирует откат, данные будут удалены.

Вы можете обойти это путем также лесозаготовок к @MyTable, это пережить откат, и поэтому вы можете откатить, а затем скопировать содержимое @MyTable в MyLoggingTable.

Смежные вопросы