2013-12-10 4 views
1

Я пишу процесс, который будет запускаться по расписанию и периодически проверять записи в базе данных SQL Server и проверять наличие изменений в этих записях. К сожалению, записи в этой базе данных никак не связаны с версией/timestamped, и я не могу изменить схему, потому что это не моя база данных. Не сравнивая каждое поле, я не знаю, как проверить, действительно ли произошло изменение.Как узнать, изменилась ли запись базы данных?

Сейчас я использую структуру сущности для доступа к данным, но при необходимости я могу переключиться на прямые запросы. Есть простой способ сделать это?

EDIT: Мне нужен способ проверить каждую отдельную запись для изменений, а не базу данных/таблицу в целом.

+0

Что бы вы могли сравнить с текущей версией, чтобы обнаружить изменение? – NoChance

+0

@EmmadKareem У меня должна быть вторая база данных, в которой хранится информация о версии. Поэтому, если я пойду с хэш-методом, предложенным Пери ниже, то второй db сохранит хэш для каждой записи. – jebar8

ответ

2

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

Но вы могли бы вычислить хэш для каждой строки и сохранить его в базе данных приложений. Затем на каждом прогоне пересчитывайте хэш и сравнивайте с тем, что находится в ваших приложениях db.

Также я знаю, что вы не можете изменить схему, но, может быть, вы можете добавить триггеры для мониторинга данных, которые будут записывать изменения?

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

+0

К сожалению, триггеры также не являются опцией; администраторы баз данных уже расстроены тем, что сторонняя сторона напрямую поражает свою базу данных. Они определенно ничего не изменят для нас. Я знаю, что это не идеально, но это то, за чем я застрял. К счастью, таблицы, в которых я работаю, имеют только несколько тысяч записей, поэтому я считаю, что хэш - хороший вариант. Есть ли способ сделать это с каркасом сущности или мне нужно будет сделать прямой запрос? – jebar8

+0

Я бы не использовал EntityFramework для этого, так как это только добавит накладные расходы и не даст вам ничего. Пойдите для прямых запросов. Для скорости я бы использовал SqlDataReader (а не DataTables). Также для того, чтобы запросить db с EF, вы должны генерировать модель в коде для базы данных и регенерировать ее каждый раз, когда изменяется db (если вы вообще не изменили эту базу данных). С помощью прямых запросов база данных может меняться, и вам не нужно менять код (SELECT *) –

1

Если вы используете SQL Server 2008 или более поздние версии, вы можете использовать либо Изменить захват данных, либо Изменить отслеживание. Вот a link to the MSDN documentation.

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