从SQL Server 2008降级到2005


32

使用SQL 2008构建的数据库文件与2005不兼容。是否可以解决?


不要忘记也导出服务器登录信息。
StanleyJohns 2011年

这是因为您在2008年进行开发,而生产服务器仍在2005年吗?您提供的任何解决方案都将延迟不可避免的事情,同时使您的生活陷入困境,因为您可能最终会定期降级。
datagod 2011年

Answers:


16

无需第三方工具。SQL Server 2008 Management Studio为我们提供了一个功能强大的工具来向下转换数据库,因为他们在“脚本数据库”向导中添加了“脚本数据”选项。

只需右键单击SQL2008 SSMS中的数据库,然后转到“任务”,然后单击“生成脚本”

逐步浏览向导,确保在表/视图选项下为“脚本数据”选择“真”。选择所有对象,然后运行它在2005服务器上创建的脚本。(请记住,如果原始数据库很大,则创建的脚本可能非常庞大!)

请注意,您甚至可以针对SQL2005服务器运行向导,以将SQL2005数据库下转换为SQL2000(当然,您需要在工作站上安装2008工具)。


4
没有冒犯,但是如果数据库很大,这不是解决方案。在具有几百万行的任何表上尝试该技术(并将varchar(max)视为单列的数据类型),如果Management Studio能够打开并解析此文件,您会很高兴的,但是我很高兴确保它不会打开,它将崩溃。抱歉,但这不是解决此问题的方法,除非数据库很小。
玛丽安

3
当然,如果数据库太大,只编写数据库结构的脚本,然后使用您喜欢的方法(SSIS,BCP,导入向导)来推送数据。
BradC 2011年

在SSMS 11.0中,似乎没有任何选项可以将数据和结构一起编写脚本。i.imgur.com/SGkG8oZ.png
jcollum

好的,现在位于表/视图选项上方的“脚本的数据类型”下
jcollum 2014年

16

您可以将数据从一个SQL Server实例BCP到另一个实例。这将是将数据从一个版本复制到另一个版本的最快方法。根据数据量,可能需要很长时间。


2
根据数据量,几乎总是需要很长时间
jcolebrand

是的,肯定会。将大型数据库迁移到旧版本的SQL Server并非易事。
mrdenny

2
BCP的好处在于,它将比使用脚本数据更快。是的,它很慢,但是比许多替代方法都快。
Jeremiah Peschka 2011年

15

据我所知,不幸的是,没有直接的方法可以将数据库从2008年的格式降级为2005年的格式。

我过去执行此操作的方式(实际上是使用旧版本的SQL Server,但过程将相同)是:

  1. 如果尚未还原SQL2008实例上的数据库
  2. 在SQL2005实例上构建具有正确结构(表,索引,约束,视图,proc,触发器等)的空DB。希望您可以从现有的构建过程和/或源代码中执行此操作,但如果没有,则可以使用SQL Server Manager为2005 DB中的所有内容创建脚本,并在2008实例中的空白脚本上运行结果。
  3. 确保两个实例可以看到彼此(即,如果实例位于不同的计算机上,则没有防火墙阻止连接),并使用sp_addlinkedserver链接它们。
  4. 将所有数据从一个数据库复制到另一个数据库。如果没有外键约束和触发器中的类似问题,您可以担心的是,您可以将数据库链接在一起,并在表列表中进行游标(从sys.objects中选择它们),然后运行
    INSERT destinationserver.destinationdb.schema.table SELECT * FROM sourcedb.schema.table
    (或者INSERT schema.table SELECT * FROM sourceserver.sourcedb.schema.table如果您已经这样链接了实例) )
    。如果您确实具有表间一致性强制约束和触发器,那么您当然需要对这些操作的顺序更加聪明,尤其是如果您具有循环约束,例如具有基于自身的约束的表(一个持有层次结构)数据(可能的示例)。

仅复制数据并在步骤3之后添加所有其他结构(索引,proc,触发器,...)可能会更有效。这避免了由约束和触发器引起的行插入顺序问题,并在索引处构建索引。从理论上讲,结束时应该比构建它们快得多,因为添加了所有数据-尽管如果表上有任何聚簇索引,则在添加数据之前创建这些聚簇索引,因为在事实创建之后它们将不会更快。

当然,所有这些都假定您的对象都不使用SQL 2008特定的功能-如果这样做,您将希望在重建架构时出错时发现并修复此类问题。如果您的任何代码都依赖于正式未定义的行为,而这种行为在SQL Server版本之间却有所不同,那么您可能会遇到一些更微妙和难以捉摸的错误,以供日后查找和解决。


1
-1,因为与BCP之类的控件相比,它实际上是低效的(选择* into from)。
jcolebrand

@jcolebrand的效率足够公平。尽管这项技术是我曾经从事过的一种技术。
David Spillett

这是一个公平的系统,我只是想由于将来的读者而将其包括在内。您目前有支持,因为这不是问题。;)
jcolebrand


1

首先,必须编写数据库脚本,并确保在指定的版本上指定要降级的类型。并将数据从较高版本复制到较低版本,SQL数据比较将为您解决问题。

祝好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.