none
Последнее изменение в БД RRS feed

  • Вопрос

  • Здравствуйте! Пользуюсь MS SQL Express 2008. Необходимо реализовать следующее: надо что бы СУБД при любом изменении в интересующей базе вносила в указанную таблицу строку (или изменяла), вписывая время изменения, и имя измененной таблицы (возможно и текст, и отправителя последнего запроса). Как достичь этого результата? Замысел прост как мир, мне необходимо проверять обновились ли данные в сервере, и по необходимости подгружать их клиентом.
    7 февраля 2011 г. 23:28

Ответы

  • вариантов много.

    простейший - использовать триггеры

    другой - завести timeStamp\rowVersion поле в таблицах, периодически их проверять

    следующий - также периодически, но с спользованием ChangeTracking

    еще способ на основе системной вьюхи sys.dm_db_index_usage_stats

    вроде бы в Express редакции нет SQL Agent, поэтому шедулить придется другими способами)

    • Предложено в качестве ответа Naomi N 8 февраля 2011 г. 2:07
    • Помечено в качестве ответа JusteG 9 февраля 2011 г. 4:24
    7 февраля 2011 г. 23:37
  • Посмотрите на второй пример (get the last update on all tables in a database) отсюда - SQL: How to get the last datetime updated of a table. Он вам не подойдет?

    Пример создания триггера для таблицы можно посмотеть здесь - Created Date & Last Modified Date Triggers, синтаксис создания триггеров - CREATE TRIGGER (Transact-SQL)


    Для связи [mail]
    • Помечено в качестве ответа JusteG 9 февраля 2011 г. 4:24
    8 февраля 2011 г. 9:32
  • Замысел прост, но реалиция обычно бывает очень сложна... С триггерами точно намучаетесь. Вариантов реализации с помошью тригеров вижу несколько.

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

    2) Вешаете триггеры на каждую таблицу на все операции, в триггере получаете данные и сохраняете в вашу таблицу первичный ключ, операцию (INSERT/UPDATE/DELETE) и имя таблицы. Потом по расписанию выгребаете эти данные, по ним получаете данные основной таблицы, формируете инструкции и выполняете на клиенте. Этот вариант легче в плане реализации, но минус его в том, что почти всё это есть в Change Tracking - http://msdn.microsoft.com/en-us/library/cc305322.aspx.

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

    • Помечено в качестве ответа JusteG 9 февраля 2011 г. 4:24
    8 февраля 2011 г. 10:20

Все ответы

  • вариантов много.

    простейший - использовать триггеры

    другой - завести timeStamp\rowVersion поле в таблицах, периодически их проверять

    следующий - также периодически, но с спользованием ChangeTracking

    еще способ на основе системной вьюхи sys.dm_db_index_usage_stats

    вроде бы в Express редакции нет SQL Agent, поэтому шедулить придется другими способами)

    • Предложено в качестве ответа Naomi N 8 февраля 2011 г. 2:07
    • Помечено в качестве ответа JusteG 9 февраля 2011 г. 4:24
    7 февраля 2011 г. 23:37
  • sys.dm_db_index_usage_stats работает, но маленько не то что нужно.

    Как решить мою задачу по средствам тригеров?

    8 февраля 2011 г. 6:36
  • Посмотрите на второй пример (get the last update on all tables in a database) отсюда - SQL: How to get the last datetime updated of a table. Он вам не подойдет?

    Пример создания триггера для таблицы можно посмотеть здесь - Created Date & Last Modified Date Triggers, синтаксис создания триггеров - CREATE TRIGGER (Transact-SQL)


    Для связи [mail]
    • Помечено в качестве ответа JusteG 9 февраля 2011 г. 4:24
    8 февраля 2011 г. 9:32
  • Замысел прост, но реалиция обычно бывает очень сложна... С триггерами точно намучаетесь. Вариантов реализации с помошью тригеров вижу несколько.

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

    2) Вешаете триггеры на каждую таблицу на все операции, в триггере получаете данные и сохраняете в вашу таблицу первичный ключ, операцию (INSERT/UPDATE/DELETE) и имя таблицы. Потом по расписанию выгребаете эти данные, по ним получаете данные основной таблицы, формируете инструкции и выполняете на клиенте. Этот вариант легче в плане реализации, но минус его в том, что почти всё это есть в Change Tracking - http://msdn.microsoft.com/en-us/library/cc305322.aspx.

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

    • Помечено в качестве ответа JusteG 9 февраля 2011 г. 4:24
    8 февраля 2011 г. 10:20
  • Спасибо за исчерпывающую информацию, буду разбираться.
    9 февраля 2011 г. 4:25