修复SQL Server依赖信息损坏问题

在数据库对象数量较多时,依赖信息损坏是一个常见问题。本文将介绍如何使用Red Gate的SQL CompareSQL Packager工具,即使在sysdepends表中的依赖信息丢失的情况下,也能自动生成数据库脚本。

SQL Server在设计时,会在对象创建、修改和销毁时记录依赖信息。这种方法意味着在脚本创建过程中几乎没有开销。对于拥有大量依赖关系的大数据库来说,这提供了显著的性能优势。

但这种方法的缺点是,它可能通过三种途径引入依赖错误:

  • 当依赖链中的一个对象被删除然后重新创建时;
  • 当依赖链中的一个对象被重命名时;
  • 当SQL Server中存在bug时。

当sysdepends表损坏时,如果SQL Server运行脚本,脚本很可能会失败。在这种情况下,通常的解决办法是让SQL Server生成数据库脚本,然后重新排序对象脚本,以希望保持依赖关系。

在搜索引擎中输入“SQL Server脚本依赖”会迅速返回大量关于人们正在努力解决这个问题的故事。如果数据库有超过几个依赖关系,那么很难确定在重新创建数据库时应该以什么顺序向SQL Server呈现脚本。

解决方案

Red Gate的SQL Compare一个鲜为人知的特性是,它能够在不依赖sysdepends中的依赖信息的情况下,按正确的顺序生成对象脚本。

为了展示SQL Compare如何处理丢失或错误的sysdepends信息,将删除数据库中的所有依赖信息。显然,这在现实生活中永远不会发生,但这是一个非常好的例子,展示了SQL Compare如何完美地处理损坏的信息。

首先,创建两个数据库——损坏的和空白的。然后,创建三个具有简单依赖链的对象——一个表,一个依赖于该表的视图,然后是第二个视图依赖于第一个视图。

在幕后,sysdepends表已经被更新。接下来,改变了SQL Server的一个基本权限。不要在任何有重要信息的服务器上这样做。

现在清除sysdepends表。接下来,重新配置SQL Server,看看sysdepends中是否有任何内容。如所见,sysdepends现在是空的。

数据库现在已经损坏到无法修复的程度,直到现在,脚本这个数据库是不可能的。但是,有了SQL Compare的新版本,它将完美地工作。

首先将损坏的数据库与空白数据库进行比较。损坏的数据库中存在这三个对象。让创建一个脚本,将这些对象放入空白数据库。

从这个摘要中可以看到,尽管sysdepends表是空的,这三个对象将按正确的顺序被创建。现在让运行这个脚本并重新比较。

空白数据库现在有这三个对象,并且运行良好。

通过重命名、删除和重新创建对象,或者通过SQL Server中的bug,sysdepends很容易损坏。SQL Compare在脚本过程中轻松解决了这个问题。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485