Использование sp_MSForEachTable для удаления всех данных без заполнения журнала транзакций - PullRequest
0 голосов
/ 17 июня 2020

У меня есть база данных, из которой я хочу удалить все данные из всех таблиц. База данных полна ссылочной целостности (внешние ключи, et c), поэтому я не могу использовать truncate - мне нужно использовать delete.

Я нашел этот скрипт (источник: { ссылка }):

USE [myDatabase]
GO
EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ?'
GO

Однако сценарий не работает со следующими ошибками:

Msg 9002, Level 17, State 4, Line 7
The transaction log for database 'myDatabase' is full due to 'ACTIVE_TRANSACTION'.
Msg 9002, Level 17, State 4, Line 9
The transaction log for database 'myDatabase' is full due to 'ACTIVE_TRANSACTION'.

Как я могу переписать сценарий, чтобы не заполнять транзакцию журнал? Я уже пробовал перезапустить SSMS. Изменить файл журнала на simple, а не на full, вероятно, будет непросто, поскольку у нас нет контроля над файлом журнала (доступ есть только у администратора базы данных). Тем не менее, я изучил концепцию под названием checkpoints, но застрял.

Может ли кто-нибудь изменить этот скрипт, чтобы он использовал контрольные точки для удаления партиями, а затем очищал журнал, а не удалял все за один раз go? Или предложить другое решение, о котором я не думал?

1 Ответ

1 голос
/ 17 июня 2020

предоставить другое решение, о котором я не думал?

Отбросьте все ограничения и используйте TRUNCATE TABLE. Тогда не будут регистрироваться строки, только выделенные экстенты. Или напишите сценарий для всех объектов и создайте их в новой базе данных.

...