sql—使用sp\ msforeachtable删除所有数据而不填充事务日志

bd1hkmkf  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(293)

我有一个数据库,我想删除所有表中的所有数据。数据库充满了引用完整性(外键等),所以我不能使用 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 ,但我被困住了。
是否有人可以更改此脚本,使其使用检查点进行批量删除,然后清除日志,而不是一次性将其全部删除?或者提供另一个我没想到的解决方案?

new9mtju

new9mtju1#

提供另一个我没想到的解决方案?
删除所有约束并使用truncate table。这样就不会记录行,只记录区段分配。或者编写所有对象的脚本并在新数据库中创建它们。

相关问题