清理数据库

时间:2009-08-18 16:46:04

标签: sql sql-server tsql sql-server-2008

我有一个包含数百个表的数据库。

我正在构建一个脚本来删除此数据库中的所有行。

当然,作为一个关系型数据库,我必须先删除孩子们的行,然后才能触摸父母。

有什么我可以用来做这件事,还是我必须这么做?

修改

已接受的答案已修改为包含“禁用触发器”

EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ? '
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ? '

3 个答案:

答案 0 :(得分:7)

您可以禁用所有约束,然后删除所有数据,并再次启用约束。您可以将代码放在存储过程中以进行重用。快速又脏的东西:

CREATE PROCEDURE sp_EmplyAllTable
AS
EXEC sp_MSForEachTable ‘ALTER TABLE ? NOCHECK CONSTRAINT ALL’
EXEC sp_MSForEachTable ‘DELETE FROM ?’
EXEC sp_MSForEachTable ‘ALTER TABLE ? CHECK CONSTRAINT ALL’
GO

答案 1 :(得分:4)

我猜你想要没有任何数据的结构?

您可以编写表/ sp /用户定义的函数/触发器/权限等脚本,然后在使用脚本重新创建数据库之前删除数据库吗?

此链接说明如何使用SQL Server Management studio为数据库中的所有对象生成脚本... http://msdn.microsoft.com/en-us/library/ms178078.aspx

答案 2 :(得分:2)

如果这是MySQL,我会使用“mysqldump --no-data”来备份数据库元数据。然后我会完全删除数据库并恢复无数据备份。

除了三步过程之外,就交易和I / O而言,它比单独从每个表中删除要快得多。它还缩小了磁盘上的表空间,删除不会(对InnoDB来说)。

我不熟悉Microsoft SQL Server的备份工具,是否有一些等效选项?


我认为我找到了一些有希望的东西:How to: Generate a Script (SQL Server Management Studio)

  

生成整个脚本   数据库

     
      
  1. 在对象资源管理器中,连接到SQL Server数据库的实例   引擎然后展开该实例。
  2.   
  3. 展开数据库,右键单击任何数据库,指向任务,指向   生成脚本,然后按照   生成脚本向导中的步骤。
  4.