仅在两个数据库之间复制数据

时间:2010-11-11 20:35:06

标签: sql sql-server sql-server-2008

我试图仅在两个SQL Server 2008数据库之间复制数据。我需要保持现有的存储过程和函数不变并仅复制数据。数据库架构完全相同,但我遇到了PK的问题。

我第一次尝试:

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'

删除所有数据。但是得到

Failure inserting into the read-only column 

所以我接着尝试在所有表中设置IDENTITY_INSERT:

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable  'ALTER TABLE ? SET IDENTITY_INSERT ON'

没有运气。

仅在两个数据库之间导出数据的最佳方法是什么,原始的proc和函数保持不变?

感谢。

编辑:我使用SQL导出将数据从源复制到目标。我需要保留目标DBs的proc和函数,只需复制数据。

5 个答案:

答案 0 :(得分:2)

只需从第二个db中的所有表pkeys中删除标识规范。

这里可能发生的事情是你在两个dbs中都有pkey作为标识列,并且在第一个中这样做是有意义的,但是你不能将它的值复制到另一个标识列中。

你不希望pkey作为第二个数据库中的身份密钥,然后,你的所有外键都不会工作。

答案 1 :(得分:1)

我可能会从不同的角度处理它:通过SQL Enterprise Manager将所有对象编写到文件中并在空白数据库上运行此文件。这样,您将拥有所有元数据,但第二个数据库中没有实际数据,您可以在将来将其用于其他副本。

答案 2 :(得分:1)

您获得的错误似乎不是PK违规或身份问题。我看到两个可能的原因:

  1. 如果您在尝试插入数据时收到错误,我会检查表中是否有computed columns。许多程序在导出数据时未将它们考虑在内,并在插入列列表中包含计算列。

  2. 如果您在删除步骤中收到该错误,可能是您在删除时触发了一个触发器,并且它尝试插入数据并因某些原因失败(这些触发器的想法是维护一个副本删除了另一个位置的数据)。如果是这种情况,请修复插入或仅禁用触发器。

答案 3 :(得分:0)

最后,我对这两个答案进行了讨论。我使用第3个数据库作为临时数据库。

1)我完全备份了数据库,我需要(实时)数据 2)我将此备份恢复到临时数据库 3)我编写了数据库脚本我需要procs和函数,只需要脚本procs和funcs,并使用DROP和IF INCLUDES。
4)我从#3对我的临时数据库运行脚本,从DB1中获取数据,从DB2中获取procs和funcs 5)我从临时数据库的备份中使用OVERWRITE恢复了DB2。

谢谢你们,如果可以的话,我们会将所有内容都标记为正确。

答案 4 :(得分:0)

您好,为了解决您的约束问题,请阅读我在此主题上撰写的博客文章。

http://tenbulls.co.uk/2009/07/22/checking-your-constraints-to-check-your-integrity/