C# / SQL Listener, чтобы сказать мне, если строка была вставлена в таблицу
Может кто-нибудь опубликовать пример кода или сказать мне, как настроить прослушиватель, чтобы уведомить меня (инициировать событие), если новая строка вставлена в базу данных SQL Server?
Я не хочу использовать какие-либо службы обмена сообщениями или брокера SQL Server. В настоящее время у меня есть прослушиватель файлов, который уведомит меня, когда новые строки будут добавлены в плоский файл. Я хотел бы сделать то же самое для таблицы базы данных.
7 ответов
Возможно, вы ищете класс SqlDependency, который позволяет вашему коду кода получать уведомления, когда происходят изменения?
SqlDependency
идеально подходит для сценариев кэширования, когда ваше приложение ASP.NET или служба среднего уровня должны хранить определенную информацию в кэше.SqlDependency
позволяет получать уведомления, когда исходные данные в базе данных изменяются, так что кэш может быть обновлен.
Или это относится к сфере вещей, которые вы запрещаете, не совсем понятно?
Вам нужно будет выполнить какой-либо триггер базы данных при вставке или регулярно опрашивать базу данных для поиска новых записей. Я не рекомендую последнее предложение, поскольку оно может быть очень интенсивным.
Кроме этого, вы не даете нам много, чтобы продолжить. Какую версию SQL Server вы используете? Что ты уже пробовал? С какими проблемами вы столкнулись?
Вот несколько ссылок, которые могут указать вам правильное направление:
Как: создать и запустить триггер CLR SQL Server
Подобный вопрос, который предлагает альтернативный (лучший?) Способ сделать это: могут ли триггеры SQL CLR сделать это? Или есть лучший способ?
Я также рекомендую триггер, который регистрирует вставки где-то в БД (и вы все равно должны опрашивать базу данных, что не так уж и дорого, если триггер изменяет специальную таблицу с одной строкой). Но если у вас есть IDENTITY в вашем первичном ключе, вы можете отслеживать значение текущей идентичности таблицы:
SELECT IDENT_CURRENT('TableName')
Это, однако, хак, но это быстро, и вам не нужно изменять базу данных (конечно, она работает только для операций вставки). Однако вы можете пропустить операции вставки, если между идентификаторами опроса значение идентификатора было явно изменено и было точно установлено значение, которое было в момент предыдущего опроса (хотя это не очень вероятно).
Вы можете использовать уведомления SQL для этого, но вы сказали, что не хотите использовать брокера. В противном случае вы можете опросить, но, как уже упоминалось, это может вызвать проблемы с производительностью.
Другой способ сделать это - использовать триггеры в таблице базы данных, чтобы прикоснуться к файлу в файловой системе.
exec master..xp_cmdshell 'echo changed > c:\temp\filewatcher.txt'
Затем используйте FileSystemWatcher, как вы упомянули, что вы уже делаете в своем приложении, чтобы получить уведомление об изменении файла.
Существуют разрешения безопасности, которые вам необходимо предоставить вашему пользователю Sql Server, чтобы сделать это возможным, но если это приемлемо, то это будет работать без использования посредника.
Согласно "Damien" вам нужно использовать sqldependency для обнаружения изменений.
пример для sqldependency в MSDN: - https://msdn.microsoft.com/en-us/library/62xk7953(v=vs.110).aspx
Я хотел бы рассмотреть CLR триггер, пожалуйста, прочитайте следующие статьи...
Триггер звучит лучше всего:
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