创建数据库副本 - 由于使用“标识”规范而失败

时间:2012-01-30 18:44:24

标签: sql database sql-server-2008 data-structures identity-column

我一直试图弄清楚如何正确地适应如何处理“身份”问题。生成脚本以重新创建数据库时的列。

我需要为此生成脚本的原因是因为我必须降级' SQL数据库到旧版本。我知道数据库中的所有内容(v10.5)都与旧版本(v10.0)兼容。我面临的问题是,在3种不同的复制数据库方法中,它总是失败,因为它无法维护原始的ID字段(即身份)。

我的每张桌子都有第一列ID: Int = PK & Identity。我也有很多情况,表格在这一栏中并不完美顺序,例如,1,2,3,5,8,12,13等。这只是因为那些记录已被删除了过去。但似乎无法以与以往相同的顺序重新插入原始ID号...

那么如何从服务器A到服务器B完整地复制(不备份/恢复)数据库?注意:我可以从Management Studio连接到两台服务器上的两个数据库。此外,目标服务器不是我的,它是一个共享的托管数据库,我只能访问我的数据库。我无权更改目标服务器设置。

我尝试过以下方法:

  • 为整个数据库选项生成脚本
  • 导出数据库选项
  • 备份/还原数据库 - 由于版本不匹配而失败

我猜我可能只是暂时禁用'所有表上的标识规范,插入数据,然后重新打开身份。但我编写脚本来操纵数据库结构非常糟糕。数据是我自己,我能做到的。但是操纵数据库结构,我已经习惯了使用这个工具,以至于我从来没有花时间去处理脚本 - 除了这个特殊的场景之外,希望我从来不需要学习任

1 个答案:

答案 0 :(得分:1)

我实际上已经明白了。我已经知道必须有一种暂时禁用身份规范的方法,但解决方案有点不同。除了“禁用”和“重新启用”身份规范之外,还有一个名为IDENTITY_INSERT的命令(如上面的注释中所述),当打开时,它允许将值插入到身份字段中 - 您需要确保它也会被切换回来。 IDENTITY_INSERT开关是每个连接会话,因此它不会影响其他会话。只要IDENTITY_INSERT处于启用状态,就可以插入具有该标识字段特定值的记录 - 只要它仍在主键约束内。

实际的解决方案不是用SET IDENTITY_INSERT MyTableName ON编写脚本,而是在数据库导出实用程序(在SQL管理工作室中)编写,在选择表时,选择所有表并选择要使用的高级设置{ {1}}。