我制作了一个用于Web应用程序的数据库副本,以创建此Web应用程序的新实例。我想知道如何删除所有数据和事务,以及什么不是这样只是一个干净的空壳表准备好用新数据写的?
答案 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脚本并重新创建一个数据库。
我没有走这条路的原因有几个。
如果绅士以不同的方式问这个问题,我可能确实像许多人那样回答过,并简单地说要将数据库编入脚本。
答案 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显示存储过程,没有任何上述问题。
关键是禁用参照完整性:)