Альтернатива Delete Trigger для отслеживания удаленных записей - PullRequest
2 голосов
/ 05 апреля 2011

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

До сих пор я смог реализовать элементы Update и Insert в хранилище, используя соединение класса SqlBulkCopy и оператора TSql Excepts.

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

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

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

Есть предложения?

Ответы [ 5 ]

2 голосов
/ 05 апреля 2011

Я не думаю, что триггер Delete был бы таким уж плохим. 100 миллионов записей - это, безусловно, хороший блок, но вы запускаете триггер на сервере таким образом, чтобы SQL мог оптимизировать путь выполнения.

Если вы делаете что-то еще на стороне клиента, вам придется нести дополнительные затраты при извлечении записей с сервера и последующей выдаче команд удаления в хранилище.

Что это за триггер, который беспокоит вас?

1 голос
/ 05 апреля 2011

SQL Server имеет встроенное отслеживание изменений (по крайней мере, в 2008 R2, я не уверен, когда именно эта функция была введена). Подробнее здесь: http://msdn.microsoft.com/en-us/library/cc280462.aspx

1 голос
/ 05 апреля 2011

Из того, что я читаю, вы пытаетесь заново изобрести репликацию (http://msdn.microsoft.com/en-us/library/ms151198.aspx). Означает ли это, подытожив?

0 голосов
/ 05 апреля 2011

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

0 голосов
/ 05 апреля 2011

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

-- Table to delete from
declare @T table (id int, name varchar(50))

-- Table to capture the deleted rows
declare @DeletedRows table (id int, name varchar(50))

-- Dummy data
insert into @T values
(1, 'Name1'),
(2, 'Name2'),
(3, 'Name3'),
(4, 'Name4'),
(5, 'Name5')

-- Delete every other row
delete from @T
output deleted.id, deleted.name into @DeletedRows
where id % 2 = 0

select *
from @DeletedRows

Результат - Удаленные строки

id          name
----------- --------------------------------------------------
2           Name2
4           Name4
...