2009-12-29 81 views
0

我需要使用T-SQL在SQL Server 2005中删除一个特定的数据库。我知道删除数据库不能在数据库trnsaction中完成。那么,如果删除一个真正巨大的数据库时会发生一些意外的异常。超时例外。它会使我的数据库处于不稳定状态吗?如果是的话,我该如何避免这种情况?什么是以编程方式删除大型数据库的最佳方法

回答

2

取决于您如何运行t-sql,您可以在运行命令之前更改超时。 SSMS默认没有超时,但可以将SqlCommand的CommandTimeout更改为0(无超时)或较大的值。根据我个人的经验,“drop database”失败的运行并没有阻止它成功的后续运行,所以虽然你可能会让数据库进入一个糟糕的状态,但我不认为它会在那里仍然存在,但不可丢弃(但这只是我的经验,诚然)

根据是否要删除数据文件,我建议将数据库设置为single_user模式(如果要删除文件)或脱机(不要删除文件)并立即回滚,以防止其他连接阻止丢弃或导致失败。

所以:

  • ALTER DATABASE [富]集SINGLE_USER与回滚立即
  • ALTER DATABASE [富]与回滚立即
  • DROP DATABASE [富]设置为脱机

请务必检查drop database的各种行为(如上所示)@http://msdn.microsoft.com/en-us/library/ms178613.aspx

3

删除所有记录在数据库中,同时使数据库结构到位,最好的办法是:

  1. 使数据库脱机;
  2. 禁用所有外键约束(如果强制执行参照完整性);
  3. 依次截断每个表;
  4. 启用所有外键约束(如果需要引用完整性);
  5. 刷新任何物化视图;
  6. 重新分析数据库(因为之前的统计数据不再相关);
  7. 使数据库重新联机。

这一切都可以通过编程方式完成,但会根据您的数据库供应商和版本而有所不同。对于SQL Server 2005(您的请求版本),请尝试How to: Truncate Multiple Tables In SQL Server and the magic of sp_MSforeachtable

这不应该让数据库处于无法使用的状态,如果它失败了,因为它是以这样的方式完成的,如果它意外停止,您可以重新运行它,它会继续。

如果您尝试使用数据库,如果脚本过早完成,那么您的数据库完全有可能处于不一致的状态(这是您脱机执行它的一半原因;另一个原因是为了避免锁定) 。

更新:如果您只是想完全删除数据库,请参阅How do I drop a SQL Server database?。它涉及到一个DROP DATABASE命令,但有时您需要有效地使数据库脱机。

+0

如果在使用TRUNCATE TABLE时存在引用键,则只需禁用(或删除)约束,在这种情况下,如果表是关系中的父表,则重新启用/添加约束的尝试将失败。 – 2009-12-29 09:09:48

+0

@OMG:澄清了约束部分。 – cletus 2009-12-29 09:11:45

+0

我甚至不想在服务器上留下数据库结构,需要完全删除数据库。 – 2009-12-29 09:34:58

0

分离数据库,然后删除文件。

+1

重新连接之前,您无法访问分离的SQL Server数据库。 – 2009-12-29 09:11:42

+0

正确,这不会有帮助,因为它需要以编程方式完成。您无法访问分离的SQL Server数据库。可能会给你一个运输级别的错误。 – 2009-12-29 09:33:28

相关问题