C # / SQL Listener, чтобы сказать мне, если строка была вставлена ​​в таблицу - PullRequest
9 голосов
/ 16 июня 2011

Может кто-нибудь опубликовать пример кода или сказать мне, как настроить прослушиватель, чтобы он уведомлял меня (инициировал событие), если новая строка вставлена ​​в базу данных SQL Server?

Я не хочу использовать какие-либо службы обмена сообщениями или брокера SQL Server.В настоящее время у меня есть прослушиватель файлов, который уведомит меня, когда новые строки будут добавлены в плоский файл.Я хотел бы сделать то же самое для таблицы базы данных.

Ответы [ 7 ]

8 голосов
/ 16 июня 2011

Возможно, вы ищете класс SqlDependency , который позволяет регистрировать ваш код, чтобы получать уведомления об изменениях?

SqlDependency идеально подходит для сценариев кэширования, когда ваше приложение ASP.NET или служба среднего уровня должны хранить определенную информацию в кэше. SqlDependency позволяет получать уведомления, когда исходные данные в базе данных изменяются, чтобы можно было обновлять кэш.

Или это относится к сфере вещей, которые вы запрещаете, не совсем понятно?

2 голосов
/ 16 июня 2011

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

Кроме этого, вы не даете нам много, чтобы продолжить. Какую версию SQL Server вы используете? Что ты уже пробовал? С какими проблемами вы столкнулись?


Вот несколько ссылок, которые могут указать вам правильное направление:

Изучение триггеров SQL Server

Как: создать и запустить триггер CLR SQL Server

Подобный вопрос, который предлагает альтернативный (лучший?) Способ сделать это: Могут ли триггеры SQL CLR сделать это? Или есть лучший способ?

1 голос
/ 16 июня 2011

Я также рекомендую триггер, который регистрирует вставки где-то в БД (и вы все равно должны опрашивать базу данных, что не так дорого, если триггер изменяет специальную таблицу с одной строкой). Но если у вас есть IDENTITY в вашем первичном ключе, вы можете отслеживать значение текущей идентичности таблицы:

SELECT IDENT_CURRENT('TableName')

Это, однако, хак, но это быстро, и вам не нужно изменять базу данных (конечно, она работает только для операций вставки). Однако вы можете пропустить операции вставки, если между идентификаторами опроса значение идентификатора было явно изменено и было точно установлено значение, которое было на момент предыдущего опроса (хотя это не очень вероятно).

1 голос
/ 16 июня 2011

Вы можете использовать sql уведомления для этого, но вы сказали, что не хотите использовать брокера. В противном случае вы можете опросить, но, как уже упоминалось, это может вызвать проблемы с производительностью.

Еще один способ сделать это - использовать триггеры в таблице базы данных для прикосновения к файлу в файловой системе.

exec master..xp_cmdshell 'echo changed > c:\temp\filewatcher.txt'

Затем используйте FileSystemWatcher , как вы упоминали, что вы уже делаете в своем приложении, чтобы получить уведомление об изменении файла.

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

0 голосов
/ 22 марта 2017

В соответствии с "Damien" вам нужно использовать sqldependency для обнаружения изменений.

образец для sqldependency на MSDN: - https://msdn.microsoft.com/en-us/library/62xk7953(v=vs.110).aspx

0 голосов
/ 17 июня 2015

Я бы рассмотрел триггер CLR. Пожалуйста, прочтите следующие статьи ...

Создайте свой первый триггер CLR в SQL Server

Триггеры CLR

0 голосов
/ 16 июня 2011

Триггер звучит лучший вариант:

create TRIGGER [tI_Notifier] ON [dbo].[your_table_name] AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    declare @id1 int --or same type as your key
        --declare other variables you want to read from the inserted row

        --read columns values from inserted row
    select @id1 = <some_key_column>, @id2=<second_column> from inserted

    --do something with row's new values

    SET NOCOUNT OFF;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...