2008-12-04 8 views
6

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

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

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

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

ответ

0

я лично не использовал его, но это звучит как Notification Services стоит посмотреть

More Here...

+0

FYI: службы уведомлений SQL устарели в SQL 2008, не будут доступны в выпусках за 2008 г. cite: http://blogs.technet.com/andrew/archive/2008/10/21/sql-server- 2008-notification-services.aspx – Cheeso 2009-05-18 13:10:59

0

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

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

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

+0

Что вы описали - напишите краткую сводку об изменениях в отдельной таблице - это то, что делает функция отслеживания изменений SQL 2008. Затем клиенты могут просто запросить таблицу изменений, чтобы получить аудит всех изменений. – Cheeso 2009-05-18 13:12:36

2

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

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

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

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

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

Change Tracking

Change Data Capture

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

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

+0

Хм ... Мы используем только 2005 год. Я, вероятно, мог бы продвигаться и обновляться до 2008 года, но наш отдел QA может жаловаться. Ваше предложение таблицы зеркального типа может работать.По большей части все наши таблицы проверяются с помощью триггеров и таблиц аудита. Каждое изменение регистрируется в них. – CuppM 2008-12-05 15:52:39

+0

Но при использовании таблиц аудита потребуется фоновый поток, который постоянно проверяет эти таблицы. Я отправил тот же вопрос в форме MSDN (http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=4209397&SiteID=17). Кто-то предложил System.Data.Sql.SqlNotificationRequest. Любые мысли по этому поводу? – CuppM 2008-12-05 15:59:18

+0

FYI: службы уведомлений SQL, которые требуются SqlNotificationRequest, устарели в SQL 2008, не будут доступны в выпусках за 2008 год. Cite: http://blogs.technet.com/andrew/archive/2008/10/21 /sql-server-2008-notification-services.aspx Исходя из этого, я бы рекомендовал вам посмотреть другие варианты. – Cheeso 2009-05-18 13:13:50

0

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

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

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

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

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

7

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

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

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

MSDN for 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); 
} 

«Using and Monitoring SQL 2005 Query Notifications» статья, которая говорит вам через шаги, чтобы установить его в вашем коде (с помощью веб-приложение в качестве примера) наряду с соответствующими разрешениями SQL, которые необходимы для подписки на Service Broker и так далее.

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

 Смежные вопросы

  • Нет связанных вопросов^_^