我有一个数据库,我想删除所有表中的所有数据。数据库充满了引用完整性(外键等),所以我不能使用 truncate
-我必须使用 delete
.
我找到了这个脚本(来源:https://stackoverflow.com/a/1899881/6647188):
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
可能不容易,因为我们没有日志文件的控制权(只有dba有访问权)。然而,我研究了一个叫做 checkpoints
,但我被困住了。
是否有人可以更改此脚本,使其使用检查点进行批量删除,然后清除日志,而不是一次性将其全部删除?或者提供另一个我没想到的解决方案?
1条答案
按热度按时间new9mtju1#
提供另一个我没想到的解决方案?
删除所有约束并使用truncate table。这样就不会记录行,只记录区段分配。或者编写所有对象的脚本并在新数据库中创建它们。