У меня есть база данных, из которой я хочу удалить все данные из всех таблиц. База данных полна ссылочной целостности (внешние ключи, 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? Или предложить другое решение, о котором я не думал?