如何彻底清理SQL Server 2005数据库?

时间:2009-04-06 19:20:33

标签: sql-server

我制作了一个用于Web应用程序的数据库副本,以创建此Web应用程序的新实例。我想知道如何删除所有数据和事务,以及什么不是这样只是一个干净的空壳表准备好用新数据写的?

9 个答案:

答案 0 :(得分:8)

Sql Server Database Publishing Wizard.仅使用模式创建脚本,指定删除现有对象。

答案 1 :(得分:2)

运行此脚本:

select 'TRUNCATE TABLE ' + name from sysobjects where xtype='U'

然后将结果粘贴到新脚本中并运行

(为了上帝的缘故,小心!):)

修改

从注释看来,TRUNCATE似乎无法从具有外键的表中删除行。

您可以使用

select 'DELETE FROM ' + name from sysobjects where xtype='U'

并且您还必须首先重新排列输出以从子表中删除。其他人建议编写一个干净的数据库脚本,这可能是TBH的一个更好的主意。

答案 2 :(得分:1)

取消注释 - 实际运行......小心!!

Declare @t varchar (1024)
Declare tbl_cur cursor for  
select TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'

OPEN tbl_cur

FETCH NEXT  from tbl_cur INTO @t

WHILE @@FETCH_STATUS = 0
BEGIN
--EXEC ('TRUNCATE TABLE '+ @t)
FETCH NEXT  from tbl_cur INTO @t
END

CLOSE tbl_cur
DEALLOCATE tbl_Cur

修改 在回答评论问题时...该死的好问题。我想你可以找到所有的外键并将它们保存起来

SELECT 'ALTER TABLE ' + b.TABLE_NAME + ' WITH CHECK ADD CONSTRAINT [' + a.CONSTRAINT_NAME + '] FOREIGN KEY ' 
    + c.COLUMN_NAME + ' REFERENCES [' + d.TABLE_NAME +'] ([' + e.COLUMN_NAME + '])'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS a
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS b
    ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS d
    ON a.UNIQUE_CONSTRAINT_NAME = d.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
ON a.CONSTRAINT_NAME = c.CONSTRAINT_NAME
INNER JOIN (
    SELECT
    f.TABLE_NAME,
    g.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS f
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE g
    ON f.CONSTRAINT_NAME = g.CONSTRAINT_NAME
WHERE f.CONSTRAINT_TYPE = 'PRIMARY KEY'
) e
ON e.TABLE_NAME = d.TABLE_NAME
ORDER BY a.CONSTRAINT_NAME

然后你可以放弃所有这些(我不相信你放弃约束的顺序很重要)

SELECT 'ALTER TABLE ' + col.TABLE_NAME + ' DROP CONSTRAINT ' + u.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.COLUMNS col
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
    ON col.TABLE_NAME = u.TABLE_NAME
    AND col.COLUMN_NAME = u.COLUMN_NAME
INNER JOIN INFORMATION_SCHEMA.table_constraints t
    ON u.CONSTRAINT_NAME = t.CONSTRAINT_NAME
WHERE t.CONSTRAINT_TYPE = 'FOREIGN KEY'

然后使用第一个游标截断所有表。然后,您可以使用保存的脚本结果重新创建所有FK关系。

答案 3 :(得分:0)

你只需截断每个表,如

use [dbname]
truncate table [table]

其中[dbname]是复制数据库的名称,您将复制数据库中每个表的第二行。

我确信大约需要5-10分钟,您可以创建一个脚本,该脚本将读取systables中列出的所有可用表,并使用该信息执行while循环,因此您不必编写“truncate” table [table]“对于每个表,但这是一般的想法。

-

确定,

对于我之后回答的所有人,我正在接受这种精神上的“内疚”事情,因为我没有写下他应该创建一个TSQL脚本并重新创建一个数据库。

我没有走这条路的原因有几个。

  1. 你不知道是什么类型的 他所拥有的“静态”数据 数据库。
  2. 他特意问道 关于如何清理数据库。
  3. 我目前不知道@OP是什么 已经建成了其余的 系统。可能会有 他需要副本的依赖项 原来是为了满足一个 条件。
  4. 如果绅士以不同的方式问这个问题,我可能确实像许多人那样回答过,并简单地说要将数据库编入脚本。

答案 4 :(得分:0)

我不知道任何一步神奇的银弹命令,但是如果你想保留你的表/模式,你可能需要为每个表编写截断表。

或者,您可以编写整个数据库的脚本,并在删除“已使用”数据库后使用该脚本重新生成新数据库。有意义吗?

右键单击要处理的数据库,选择Script Database As(从顶部开始的第3个选项),然后选择DROP和CREATE to ...此时可能要对文件执行此操作或者剪贴板并将其粘贴到某处。

然后,将此文件作为您的脚本使用,运行它以创建一个干净漂亮的数据库。

答案 5 :(得分:0)

您可以创建一个空数据库,然后使用SQL Compare之类的内容将现有数据库与空数据库进行比较,以生成脚本,从头开始重新创建数据库。

您还可以使用以下SQL:

--// Switch to the database to be modified
USE DatabaseName;

--// The following commands need to be run for each table
--// You could perhaps automate this by using a cursor
--// First truncate the table and remove all data
TRUNCATE TABLE MyTable;

--// Also reset the identity seed
DBCC CHECKIDENT (MyTable, reseed, 1)

我建议从头开始重新创建数据库结构,而不是进行备份和恢复到新数据库,因为这样可以为您提供一个完全干净的数据库而不会出现任何“残留”(​​如交易日志)。

答案 6 :(得分:0)

如果您没有定义外键,截断将起作用(如果您没有,请添加它们)。

如果使用SQL Server 2005(08可能相同),则可以从Sql Server Management Studio中为整个数据库生成脚本。右键单击要编写脚本的数据库。

然后转到任务,并生成脚本。编写所有对象的脚本,然后您可以使用此脚本仅基于模式构建数据库的新副本。

答案 7 :(得分:0)

您可能只想生成一个仅包含现有数据库结构的t-sql脚本。 SQL Server管理控制台使这非常简单,因为您只需右键单击原始数据库,选择“任务 - >生成脚本”。从那里,只需单击默认值并选择要复制的对象(表等)。

这会生成一个很好的T-SQL脚本,您可以将其应用于任何空白数据库,为您提供没有数据的结构。对我来说,与截断相比,这似乎是一个更合适的选择。

答案 8 :(得分:0)

article显示存储过程,没有任何上述问题。

关键是禁用参照完整性:)