Как использовать резервное копирование с помощью триггеров в SQL Server 2008?

У меня есть таблица (Цикл) и я создал триггер

alter trigger AnyName on Cycles
for insert,update,delete
AS
BACKUP DATABASE medrepcrm TO  DISK = N'C:\medrepcrm.bak' WITH NOFORMAT, INIT,  NAME = N'pcrm-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Но когда я вставляю, обновляю или удаляю таблицу Cycle, это приводит к ошибке.

Msg 3021, Level 16, State 0, Procedure AnyName, Line 8
Cannot perform a backup or restore operation within a transaction.
Msg 3013, Level 16, State 1, Procedure AnyName, Line 8
BACKUP DATABASE is terminating abnormally.
The statement has been terminated.

Что я могу сделать, чтобы исправить эту ошибку?


person Hazem Abdullah    schedule 31.08.2010    source источник
comment
Почему вы пытаетесь выполнить резервное копирование внутри триггера? (Если мы поймем мотивацию, мы, вероятно, сможем предложить альтернативу)   -  person Martin Smith    schedule 31.08.2010
comment
Я удивлен, что команда BACKUP действует даже внутри триггера!   -  person Mitch Wheat    schedule 29.01.2011


Ответы (2)


РЕЗЕРВНАЯ БАЗА ДАННЫХ в MSDN говорит

Оператор BACKUP не допускается в явной или неявной транзакции.

Триггер всегда в транзакциях

Если вы проработаете это, резервная копия, которая является согласованным с транзакциями моментальным снимком базы данных: для нее не имеет смысла находиться в своей собственной транзакции.

Не в последнюю очередь, при ВОССТАНОВЛЕНИИ механизм отката/отката должен был бы откатить транзакцию, содержащую резервную копию... что в первую очередь противоречит цели резервной копии...

person gbn    schedule 30.01.2011

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

person Alex    schedule 25.06.2014