Там, конечно, есть несколько возможностей сделать это:
- Реализовать небезопасный триггер CLR
- Реализовать небезопасной процедуры CLR
- Использование xp_cmdshell
- Вызов веб-службы
- Использование Query Notification
Вы можете прочитать немного о них в этой дискуссии: Serial numbers, created and modified in SQL Server.
Лично я бы предпочел Уведомление о запросах на другие методы, поскольку он уже имеет поддержку fopr различных случаев (например, синхронизация/асинхронная связь), и вам не нужно изобретать велосипед. И в вашем случае рекомендуется Microsoft.
Опрос - это еще один метод, о котором вы упоминали. Это больше похоже на традиционный метод, и могут быть некоторые связанные с производительностью штрафы, но вы не должны беспокоиться о них, если будете достаточно осторожны. Например, если у вас уже есть аутентификация, встроенная в ваше приложение, вы можете создать другой столбец в своей таблице Users
, который установлен, если есть какие-либо изменения, связанные с этим пользователем. И тогда в вашем приложении может быть только поток, который будет выполнять запрос каждую секунду против этой таблицы (даже грязные чтения с NOLOCK не должны быть проблемой здесь) и поддерживать некоторую структуру в памяти (например, нитевидный словарь) который говорит, что клиент должен быть нажат. Другой поток опроса вашего словаря и когда он находит что-то для клиента, выполняет db-запрос, который извлекает данные и отправляет их клиенту. Это выглядит как много неэффективной работы, но в конце вы получаете двух независимых работников, которые несколько помогают разделить проблемы; первый - это просто информатор, который выполняет «легкий» опрос базы данных; второй из них извлекает реальные данные и выполняет нажим сервера. Вы даже можете оптимизировать push-worker таким образом, чтобы при его запуске он проверял, нужны ли нескольким клиентам некоторые данные, а затем выполняет выбор для всех тех, кто в нем нуждается. Вероятно, вы захотите, чтобы второй рабочий работал менее часто, чем первый.
EDIT
Если вы хотите использовать non-.NET технологии для достижения той же функциональности, вы должны будете получить больше в SQL Server Service Broker. Уведомление о запросах - это упрощённый уровень, построенный в .NET поверх SQL Server Service Broker, и вам придется создавать по крайней мере часть этого слоя самостоятельно. Это включает в себя создание очереди, типа сообщения, обслуживания и хранимых процедур с помощью SEND и RECEIVE с другой стороны. Вам придется самостоятельно позаботиться о разговоре/диалоге. SB фактически представляет собой мир асинхронных сообщений, настроенный для работы в среде РСУБД, поэтому вы увидите несколько новых выражений TSQL.Однако, MSDN здесь, чтобы помочь:
Это может помочь также: Externally activate non-.NET application from Service Broker
Пример того, как закодировать материал:
-- First you have to enable SB for your database
USE master
ALTER DATABASE Playground
SET ENABLE_BROKER
GO
USE Playground
GO
-- Then create a message type; usually it will be XML
-- because it's very easy to serialize/deserialize it
CREATE MESSAGE TYPE [//Playground/YourMessageType]
VALIDATION = WELL_FORMED_XML
GO
-- Then create a contract to have a rule for communication
-- Specifies who sends which message type
CREATE CONTRACT [//Playground/YourContract] (
[//Playground/YourMessageType] SENT BY ANY)
GO
--Creates queues, one for initiator (1) and one for target (2)
CREATE QUEUE MyQueue1
GO
CREATE QUEUE MyQueue2
GO
-- Finally, configure services that 'consume' queues
CREATE SERVICE [//Playground/YourService1]
ON QUEUE MyQueue1 ([//Playground/YourContract])
GO
CREATE SERVICE [//Playground/YourService2]
ON QUEUE MyQueue2 ([//Playground/YourContract])
GO
-- Now you can send a message from service to service using contract
DECLARE
@dHandle uniqueidentifier,
@Msg nvarchar(max)
BEGIN DIALOG @dHandle
FROM SERVICE [//Playground/YourService1]
TO SERVICE '//Playground/YourService2'
ON CONTRACT [//Playground/YourContract]
WITH ENCRYPTION = OFF
SELECT @Msg = (
SELECT TOP 3 *
FROM Table1
FOR XML PATH('row'), ROOT('Table1'))
;SEND ON CONVERSATION @dHandle
MESSAGE TYPE [//Playground/YourMessageType] (@Msg)
PRINT @Msg
GO
-- To get the message on the other end, use RECEIVE
-- Execute this in another query window
DECLARE @dHandle uniqueidentifier
DECLARE @MsgType nvarchar(128)
DECLARE @Msg nvarchar(max)
;RECEIVE TOP(1)
@dHandle = conversation_handle,
@Msg = message_body,
@MsgType = message_type_name
FROM MyQueue2
SELECT @MsgType
SELECT @Msg
END CONVERSATION @dHandle
GO
какой метод был бы полезен для моей версии сервера sql, я использую ms sql сервер 2012 Express Edition. Мое приложение на сервере tomcat - webMathemaica. – niren
К сожалению, я испорчен, используя почти стандартное/корпоративное издание. Я полагаю, что в 2012 году, если вы включите [Service Broker и другие материалы уведомления о запросах] (http://msdn.microsoft.com/en-us/library/ms172133 (v = vs.80) .aspx), вы не должны есть какие-либо проблемы с использованием [SqlDependency] (http://msdn.microsoft.com/en-us/library/62xk7953.aspx) – OzrenTkalcecKrznaric
всех примеров, которые я вижу для уведомления о запросе, которое они показывают только в .Net-приложениях. могу ли я реализовать это уведомление о запросах для других клиентских приложений, таких как jsp и т. д.? Если я смогу найти хорошие примеры. – niren