Используете систему отслеживания измененных данных для приложений для небольших настольных компьютеров?

У моего нового клиента есть небольшое приложение базы данных VB/Access, написанное в 2002 году, которое он хочет переписать, чтобы сделать его более современным и поддерживать новые функции, которые он давно хотел. Итак, я собираюсь преобразовать его для использования C#.NET 2008 и SQL Server Express 2008 на локальном компьютере с возможностью масштабирования до использования WCF и SQL Server 2008 на удаленном сервере.

Одна из новых функций, которая его интересует, — это ведение и отчетность по полной истории изменений данных за определенный период времени. В прошлом я делал это с помощью триггеров и хранимых процедур, и это было головной болью @!#$.

В последнее время у меня возник зуд, чтобы возиться с функциями захвата данных изменений SQL Server 2008. В течение первого часа игры с ним я понял, что он создает задание в агенте SQL, которое по умолчанию запускается каждые 5 секунд. Также кажется, что это немного сложнее, когда мне нужно изменить схему захваченных таблиц. Кроме того, это кажется намного проще реализовать, чем мой оригинальный метод. Итак, это мои вопросы:

  1. Является ли это излишним для небольшого настольного приложения, которое может или не может в конечном итоге мигрировать на удаленный сервер?
  2. Что я должен ожидать с точки зрения производительности? По мере увеличения размера его базы данных, буду ли я получать от него больше звонков со словами, что его компьютер работает медленно?
  3. Есть ли какие-либо другие проблемы с CDC, о которых мне следует знать от тех, кто в настоящее время использует его в производстве?
  4. Есть ли у кого-нибудь ссылки на их любимые способы отслеживания изменений с течением времени, которые могут лучше подойти для небольшого настольного приложения?

Спасибо,

Марк


person Lusid    schedule 22.01.2009    source источник
comment
Хороший вопрос... Я хотел изучить его, потому что отслеживание изменений - это такая боль.   -  person JoshBerke    schedule 22.01.2009


Ответы (3)


CDC доступен только в редакции SQL Server Enterprise. поэтому, если у вас есть экспресс, вы не можете его использовать, и вам придется оставаться с триггерами.

person Mladen Prajdic    schedule 22.01.2009
comment
Аааа... Я смотрел на эту страницу: msdn.microsoft.com/en -us/library/bb522489.aspx Я предположил, что поддержка в ознакомительной версии означает Express. Этого права мне достаточно. Я сомневаюсь, что они когда-либо купят полную версию этого приложения, пока оно не будет масштабировано на удаленный сервер. - person Lusid; 22.01.2009

Хотя с триггерами сложно работать во многих отношениях, вы можете использовать их на уровне прозрачного механизма истории аудита данных без какого-либо влияния на основную кодовую базу, написав сценарии, которые фактически генерируют триггеры и таблицы истории. автоматически. Это изрядный объем работы, и я не знаю никого, кто сделал бы что-то подобное и выложил исходный код в открытый доступ, но это может быть интересный проект. По крайней мере, таким образом вы можете написать одну процедуру генератора и больше никогда не возиться с отдельными триггерами.

person Ian Varley    schedule 22.01.2009
comment
Это интересная идея. Я уже думал об этом раньше и пришел к выводу, что триггеры, написанные на SQLCLR, могут помочь в автоматизации некоторых повторяющихся сценариев, которые необходимо выполнить, но затем я начал думать о том, насколько медленной будет динамическая обработка для каждой вставки. . - person Lusid; 22.01.2009

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

Предполагая, что у вас уже есть триггеры для создания строк аудита, а в исходной таблице есть столбец с именем «Версия» типа ROWVERSION:

INSERT INTO [Changes].Sites
(
    SiteID,
    Operation,
    Version,
    ModifiedOn,
    DataChange
)
SELECT
    IsNull( I.SiteID, D.SiteID ),
    CASE
        WHEN D.[Version] IS NULL      AND I.[Version] IS NOT NULL  THEN 'I'
        WHEN D.[Version] IS NOT NULL  AND I.[Version] IS NOT NULL  THEN 'U'
        WHEN D.[Version] IS NOT NULL  AND I.[Version] IS NULL      THEN 'D'
        ELSE '?'
    END,
    IsNull( I.Version, D.Version ),
    SysDateTimeOffset(),
    (
        SELECT
            [Deleted] = ( SELECT * FROM deleted D1 WHERE D1.SiteID = D.SiteID FOR XML PATH(''), TYPE ),
            [Inserted] = ( SELECT * FROM inserted I1 WHERE I1.SiteID = I.SiteID FOR XML PATH(''), TYPE )
        FOR XML PATH('Changes')
    )
FROM deleted D
FULL JOIN inserted I
    ON D.SiteID = I.SiteID

Единственное, что в этом запросе относится к моей таблице, — это первичный ключ. Создание шаблона для создания этих запросов было бы довольно простым (можно даже сделать это в SQL, используя sys.tables и т. д.).

person Timothy Walters    schedule 11.09.2009