Триггер SQL Server - отправка сообщения в очередь - PullRequest
7 голосов
/ 23 февраля 2009

Возможно ли на триггере CLR в SQL Server 2005 отправить сообщение в очередь через MSMQ?

Я использую тип проекта SQL Server, но System.Messaging не отображается в качестве ссылки, которую я могу добавить.


В основном мне нужно какое-то действие (печать), когда строка записывается в таблицу. Устройство, генерирующее строку, представляет собой ручной сканер, который может выполнять только основные операции, одна из которых - запись на сервер SQL через odbc. Первоначальная идея состояла в том, чтобы просто опросить таблицу, получить записи, распечатать записи, удалить записи. Это, вероятно, будет работать нормально, но это показалось хорошим поводом и оправданием для изучения очередей сообщений.

Ответы [ 5 ]

4 голосов
/ 23 февраля 2009

Да, это возможно.

Я бы не стал делать это в триггере: TXN будет дольше оставаться открытым, он ресурсоемкий, что если он зависнет и т. Д.

Можно ли обновить через сохраненный процесс?

Или вставить строку в таблицу опроса, отслеживаемую заданием агента SQL, которое записывает в очередь?

3 голосов
/ 25 февраля 2009

Если эта сборка ненадежная, вы все равно можете получить к ней доступ из SQL Server - она ​​просто недоступна изначально, и ее придется импортировать вручную и помечать как саму «ненадежную». Я столкнулся с той же проблемой с System.DirectoryServices некоторое время назад.

У этого парня тот же вопрос, что и у вас в отношении System.DirectoryServices, но выполнение оператора CREATE ASSEMBLY таким же образом должно позволить вам получить доступ к System.Messaging:

http://www.mydatabasesupport.com/forums/ms-sqlserver/218655-system-directoryservices-allowable-clr.html

2 голосов
/ 23 февраля 2009

Это может сработать для вас: http://support.microsoft.com/kb/555070

0 голосов
/ 19 декабря 2018

С помощью технологии push сложно сделать транзакцию.

Единственный транзакционный вариант для этого - использовать мост WCF, и он требует, в свою очередь, использования SQL Server 2008, так как с 2012 года динамическая фоновая компиляция сборок на основе WSDL блокируется CLR, размещенной на SQL Server, и я никогда не разбирался, как принудительно компилировать эти сборки таким образом, чтобы избежать ссылок на сборки, запрещенные политиками CLR.

Единственный выбор, который я нашел работающим (возможно, из-за того, что я не смог найти обходной путь), - это использование сетевого клиента в стиле HttpClient RESTFull с интегрированной процедурой CLR, работающей от процедуры SQL Server Broker Activated. Он работает очень хорошо только с одной проблемой, RESTFull не поддерживает транзакционные из коробки. Таким образом, если вам нужна гарантированная доставка сообщения, вам понадобится контрольный звонок где-то в потоке сообщений.

Фактически для защиты целостности операций MSMQ я вставил транзакционную службу WCF между моим RESTFull и MSMQ, а в MSMQ использовал триггер, который, в свою очередь, управляет обработкой транзакционных данных на основе политик. Обратите внимание, что триггер MSMQ требует установки функции триггера MSMQ. Я выбрал триггер на основе exe, поскольку альтернативным подходом является использование DLL на основе COM, и я не чувствовал, что использую COM, так как свободная многопоточная DLL требует реализации сложного приложения C ++ и многоуровневой обработки, что относительно легко спроектировать в C # с CCW , накладывает ограничение на масштаб приложения. В конце концов, вызов RESTFull можно рассматривать как «почти транзакционный», поскольку он выполняется в контексте транзакции, и если у вас нет какой-либо серьезной ошибки, например, пропущения, чтобы перехватить условие ошибки (в основном, пропустить реализацию try / catch) и throw, когда требуется поднять условие ошибки, вы получите надежную фиксацию / откат. Однако для обеспечения надежности доставки сообщений желательно иметь подкрепление проверочным вызовом и разумным временем ожидания, когда пропущенные данные считаются равными отсутствию фиксации.

0 голосов
/ 25 октября 2011

Вот несколько новых идей о том, как можно решить эту старую проблему: http://nginn.org/blog/?p=376

Nginn-messagebus - это мой проект очереди сообщений, основанный на SQL-сервере и предназначенный для приложений .Net, использующих SQL-сервер.

...