После триггера вставки - SQL Server 2008 - PullRequest
2 голосов
/ 12 января 2010

У меня есть данные, поступающие из данных, которые помещаются в нашу базу данных SQL Server 2008 в виде таблицы: stg_table_outside_data. Источник ourside помещает данные в эту таблицу каждое утро. Я хочу переместить данные из stg_table_outside_data в table_outside_data, где я храню данные за несколько дней.

Я создал хранимую процедуру, которая вставляет данные из stg_table_outside_Data в table_outside_data и затем усекает stg_table_outside_Data. Внешний процесс создания данных находится вне моего контроля, поэтому я должен сделать все это в SQL Server 2008. Первоначально я планировал использовать простой оператор вставки после, но этап данных выполняет фиксацию после каждых 100 000 строк. Триггер запускается после первой фиксации и вызывает возникновение тупиковой ошибки для процесса обработки данных.

Есть ли способ настроить после вставки на ожидание 30 минут, а затем убедиться, что в этот период времени не было нового коммита? Есть ли лучшее решение моей проблемы? Цель состоит в том, чтобы вывести данные из промежуточной таблицы в рабочую таблицу без дублирования, а затем обрезать промежуточную таблицу для загрузки на следующее утро.

Я ценю ваше время и помощь.

Ответы [ 4 ]

2 голосов
/ 12 января 2010

Один из способов сделать это - воспользоваться новым оператором MERGE в SQL Server 2008 (см. документы MSDN и в этом блоге ) и просто запланировать его как задание SQL каждые 30 минут или около того.

Оператор MERGE позволяет легко определять операции (INSERT, UPDATE, DELETE или вообще ничего) в зависимости от того, совпадают ли исходные данные (ваша промежуточная таблица) и целевые данные (ваша "настоящая" таблица) в некоторых критерии или нет.

Так что в вашем случае это будет что-то вроде:

MERGE table_outside_data AS target
USING stg_table_outside_data AS source 
ON (target.ProductID = source.ProductID)   -- whatever join makes sense for you

WHEN NOT MATCHED THEN
    INSERT VALUES(.......)

WHEN MATCHED THEN 
    -- do nothing
1 голос
/ 12 января 2010

Вы не должны использовать триггер для этого, вы должны использовать запланированное задание.

0 голосов
/ 26 сентября 2011

Счетчик строк на триггере, если счетчик меньше 100000, ничего не делать. В противном случае запустите ваш процесс.

0 голосов
/ 12 января 2010

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

...