Подтвердить что ты не робот

Следите за таблицей новых записей в базе данных sql

Я использую EF в приложении Windows, и я хочу, чтобы мое приложение выполняло некоторые задачи, когда новая запись была вставлена ​​в определенную таблицу "эти новые записи будут вставлены сайтом с использованием того же db"
Мой вопрос: как посмотреть эту таблицу на изменения и получить уведомление, когда придет новая запись, и может ли EF помочь мне в этом случае?

UPDATE: Я использовал класс SqlDependency и использовал это в db

ALTER DATABASE UrDb SET ENABLE_BROKER

А также создал службу и очередь в базе данных http://screencast.com/t/vrOjJbA1y, но я никогда не получаю уведомление из своего приложения Windows.
Кроме того, когда я открываю очередь в sql-сервере, он всегда пуст http://screencast.com/t/05UPDIwC8ck швы, что что-то не так, но я не знаю.

4b9b3361

Ответ 1

Вот мои предложения:

  • Если вы можете добавить дублирующую таблицу в базу данных, то вот решение. У вас есть таблица1 и таблица2 (Копия table1). Когда вы вставляете новые записи в table1, вы можете сравнить их с существующими записями в таблице2 и таким образом найти новые записи. После сравнения вы должны добавить все новые записи в table2. Это какая-то синхронизация. Это можно сделать с помощью хранимой процедуры или программно.

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

  • Если вы можете изменить db, вы можете добавить что-то вроде столбца isNew в свою таблицу. Когда новые данные поступают с веб-сайта, столбец будет "истинным", ваша программа может отслеживать это, и после обработки установите для этого флага значение false для каждой записи. (Если веб-сайт не может установить этот флаг, вы можете использовать SQL TRIGGER AFTER INSERT, чтобы установить значение флага в true. Веб-сайт не может даже знать об этой функции, если это сторонний веб-сайт или вы не хотите ничего менять там)

  • Вот статья об отслеживании изменений EF: http://blogs.msdn.com/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change-tracking-with-poco.aspx

Но проблема в том, что вы должны проверять всю таблицу на изменения через EF, которая поразит производительность вашего приложения.

Ниже приведена полезная информация о методах отслеживания и реализации сторонних изменений SQL Server: http://www.mssqltips.com/sqlservertip/1819/using-change-tracking-in-sql-server-2008/ http://msdn.microsoft.com/en-us/library/bb933994.aspx

Ответ 3

Как насчет таблицы транзакций, в которой вы храните информацию о транзакции, вставленной на веб-сайт.

В таблице вставки вы создаете триггер для вставки, который помещает новую запись в таблицу транзакций.

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

Это не очень элегантно, но может работать. Я не знаком с EF, и я не знаю, есть ли у него лучшее решение для этого.

Ответ 4

См. "Изменение захвата данных", в частности sys.fn_cdc_get_max_lsn. Это создаст место для поиска изменений.

Затем запишите хранимую процедуру для опроса этого представления. Захватите ли это предыдущее значение и запустите цикл с задержкой WAITFOR, соответствующей скорости поступления данных.

Когда процедура отмечает, что самый старший LSN изменился, попросите что-нибудь сделать. Он может выбирать строки (строки). Он также может просто распечатать сообщение. Затем он возвращается на свою избирательную станцию ​​(как бы).

Печать сообщения может показаться странным и, не зная в первую очередь об EF (и будучи сильно аллергия на такие вещи), я не знаю, поможет ли это вам здесь. Но в принципе это должно быть связано с тем, что присутствует основное сообщение.

В своем приложении вызовите процедуру. Когда инструкция T-SQL PRINT (или RAISERROR) выполняется процедурой, сообщение будет отправлено клиенту. Где он идет в EF или как вы справитесь с этим, я не могу сказать, но он должен быть полезен, потому что в обычных обстоятельствах он будет отображаться пользователю. В вашем случае ваше приложение будет искать этот номер или текст сообщения и реагировать соответствующим образом. (Другие сообщения, естественно, вы бы хотели нормально обрабатывать.)

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

Ответ 5

Вы можете создать триггер SQLCLR для INSERT для таблицы. Этот триггер может вызвать простую службу WCF, которую вы можете разместить в своем приложении. Сборка с триггером должна быть зарегистрирована в SQL Server. См. здесь, как это сделать.

Другой подход (самый простой): используйте обычный триггер SQL, который отслеживает INSERT в таблице и выполняет команду xp_cmdshell с помощью команды "copy nul/Y some_file_with_path.txt". В вашем приложении может использоваться класс FileSystemWatcher для просмотра изменений в тот же файл. Настройте фильтр, чтобы следить за последним доступом только к этому конкретному файлу. См. здесь, как это сделать. Прокси-учетная запись для xp_cmdshell должна быть определена на SQL Server.

Я столкнулся с той же проблемой некоторое время назад. Я также не смог заставить службы SQl Notifications работать.

Ответ 6

Или используйте SqlTableDependency: https://tabledependency.codeplex.com/. Этот компонент с открытым исходным кодом отправляет вам событие с подробной информацией о записи о новой строке в таблице