上个月好忙,没有尽头的那种忙。但忙归忙,还是会遇到很多有趣的问题。特别是在上个月行将结束的最后一天,我们遇到的那个问题。
这是一个很少见的问题。虽然在某个特定的场景下很容易出现,但还是很少人会真正遇到。它不仅会发生在SQL Server 2005环境下,也会发生在SQL Server 2008环境下(虽然在SQL Server 2008环境下我还没有真正测试过)。
想必大家都很清楚,在系统数据库中,存在一个名为master的数据库。它是SQL server在运行时需要用到的主数据库。在SQL Server 2005环境下查看master数据库,可以看到5-6张系统表。但这些系统表的具体内容是什么,恐怕就没人知道了。而且,如果这些表丢了,会怎么样?
你可能会说:“什么?丢失系统表?在系统数据库里?”但是相信我,这不是不可能的事。右键这些系统表中的一张,然后选择删除...所以你知道这是怎么一回事了吧...
PS:这里只是解释说明,希望大家不要真的在服务器上操作删除...
导致系统表丢失的原因有很多种。在SQL Server 2000到SQL Server 2005的升级过程中,如果操作不当,就会导致系统表丢失。还有就是用户自己的问题(右键-删除),也会导致系统表丢失。如果是要应对用户误删的情形,我们可以安装一个操作追踪器——C2 Audit Traces。这款追踪器可以记录操作删除的用户名及时间。不过由于它的追踪记录只能保存一段时间,所以一些重要的信息很可能会被自动刷新。
现在让我们回到问题上——当系统表丢失我们该怎么办?其实问题不大,只有在丢失dbo.spt_values这张表的时候,我们会无法通过右键查看数据库对象的属性。比如,右键查看一个数据库,选择属性,就会出现这样一条报错:
Invalid object name 'master.dbo.spt_values'
这时不用惊慌,它是可以被修复的。在SQL Server的安装目录下(\MSSQL\Install),有一个名为u_tables.sql的sql脚本。只要在丢失系统文件的数据库服务器上,执行这个脚本,问题就修复了:系统表dbo.spt_monitor和 dbo.spt_values会重新生成,上面那条报错也将不复存在。
至于其他几张系统表,没有初始化脚本。不过我们可以从其他正常的服务器上,把其他几张表导出来,再导入到有问题的服务器。
希望这篇文章能帮到你!
原文地址:http://blogs.msdn.com/b/suhde/archive/2009/04/05/invalid-object-name-master-dbo-spt-values-microsoft-sql-server-error-208.aspx
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。