.Net SQL Server База данных Мониторинг - Вставить, Обновить, Удалить - PullRequest
6 голосов
/ 04 декабря 2008

Кто-нибудь знает способ мониторинга изменений записей таблиц в базе данных SQL Server (2005 или 2008) из приложения .Net? Он должен быть в состоянии поддерживать несколько клиентов одновременно. Каждый клиент будет «подписываться» при запуске и «отписываться» при выходе. Несколько пользователей могут получить доступ к системе одновременно, и я хочу отразить их изменения на клиенте других пользователей. Затем, когда клиент обрабатывает событие изменения, он может обновить свой локальный объект, представляющий эту запись. Отчасти похоже на то, как изменяются записи обновлений Access, в каждой форме, ссылающейся на него.

Я знаю, что у Microsoft есть свои библиотеки Microsoft.SqlServer для взаимодействия с SQL Server. Но я не уверен, какая концепция применима к тому, что я хочу сделать (или что можно согнуть, чтобы применить к тому, что я хочу сделать). Те, которые звучат так, как будто они могут быть полезны, это Управление или Репликация.

В ожидании того, что кто-то спросит: «Почему бы вам просто иногда не запрашивать таблицу для поиска новой информации?» У меня есть большое количество таблиц, которые я хочу контролировать, и это было бы болезненно. Плюс, если я ищу что-то более элегантное.

Я открыт для предложений ...

Ответы [ 5 ]

7 голосов
/ 22 мая 2009

Чтобы отслеживать изменения в таблице или записи SQL в SQL 2005+, вы можете использовать класс SqlDependency.

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

Внутри него используется SqlNotificationRequest, который использует компонент Service Broker, а не службы Notification Services. Таким образом, это должно работать на SQL 2008 и т. Д.

MSDN для SqlDependency

void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}

void SomeMethod()
{
  // Assume connection is an open SqlConnection.

  // Create a new SqlCommand object.
  SqlCommand command=new SqlCommand(
    "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers", 
    connection);

  // Create a dependency and associate it with the SqlCommand.
  SqlDependency dependency=new SqlDependency(command);
  // Maintain the refence in a class member.

  // Subscribe to the SqlDependency event.
  dependency.OnChange+=new OnChangeEventHandler(OnDependencyChange);

  // Execute the command.
  command.ExecuteReader();
  // Process the DataReader.
}

// Handler method
void OnDependencyChange(object sender, 
   SqlNotificationsEventArgs e )
{
  // Handle the event (for example, invalidate this cache entry).
}

void Termination()
{
    // Release the dependency.
    SqlDependency.Stop(connectionString, queueName);
}

" Использование и мониторинг уведомлений о запросах SQL 2005 ", в которой рассказывается, как настроить его в коде (например, с помощью веб-приложения), а также соответствующие разрешения SQL, необходимые для подписаться на Service Broker и т. д.

Класс ASP.NET (веб-кэширование) также доступен для веб-сценариев.

2 голосов
/ 05 декабря 2008

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

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

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

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

Вот ссылка на дополнительную информацию о обоих

Отслеживание изменений

Изменение сбора данных

По большей части отслеживание изменений, вероятно, будет лучшим вариантом - плюс оно работает во всех версиях SQL Server 2008.

Если вы хотите достичь этого в 2005 году или ниже, вы можете создавать таблицы для каждой таблицы, которую вы хотите отслеживать, и иметь триггер для вставки значений в таблицу отслеживания при вставке, обновлении, удалении. Тогда есть процесс, чтобы очистить это. Это в основном то, что отслеживание изменений делает для вас.

0 голосов
/ 05 декабря 2008

Я думаю, что неправильно понял вопрос.

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

Или это отключенное приложение, в котором вы хотите синхронизировать изменения?

Для отключенных приложений вы можете использовать syncservices for SQL Server.

Кроме этого, просто используйте LINQ to Entities, и вы сможете обрабатывать конфликты при сохранении изменений объекта. Чтобы убедиться, что запросы, производимые LINQ, выполняются, вы можете добавить столбец TIMESTAMP в каждую таблицу, но это не обязательно.

0 голосов
/ 05 декабря 2008

Этот сценарий обычно не очень хорошо масштабируется ... вы можете посмотреть на службы уведомлений SQL, но это имеет те же проблемы.

В одной системе я делаю это с помощью триггеров, которые записывают краткую сводку изменений (одной) дельта-таблицы, включая таблицу, тип изменения и идентификатор строки. Каждый клиент поддерживает «где я читал» и просто запрашивает все дельта-записи с id> этим номером. Проблема в том, что вам нужно сделать что-то умное, чтобы очистить таблицу, не удаляя при этом историю изменений отдельных клиентов ... то есть отслеживать выходы из системы, предполагать, что они устарели после определенного времени, и регистрировать их при полном обновлении.

Определенно выполнимо, но много работы.

0 голосов
/ 05 декабря 2008

Я лично не пользовался им, но, похоже, службы Notification Services стоит посмотреть

Подробнее здесь ...

...