我试图仅在两个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和函数,只需复制数据。
答案 0 :(得分:2)
只需从第二个db中的所有表pkeys中删除标识规范。
这里可能发生的事情是你在两个dbs中都有pkey作为标识列,并且在第一个中这样做是有意义的,但是你不能将它的值复制到另一个标识列中。
你不希望pkey作为第二个数据库中的身份密钥,然后,你的所有外键都不会工作。
答案 1 :(得分:1)
我可能会从不同的角度处理它:通过SQL Enterprise Manager将所有对象编写到文件中并在空白数据库上运行此文件。这样,您将拥有所有元数据,但第二个数据库中没有实际数据,您可以在将来将其用于其他副本。
答案 2 :(得分:1)
您获得的错误似乎不是PK违规或身份问题。我看到两个可能的原因:
如果您在尝试插入数据时收到错误,我会检查表中是否有computed columns。许多程序在导出数据时未将它们考虑在内,并在插入列列表中包含计算列。
如果您在删除步骤中收到该错误,可能是您在删除时触发了一个触发器,并且它尝试插入数据并因某些原因失败(这些触发器的想法是维护一个副本删除了另一个位置的数据)。如果是这种情况,请修复插入或仅禁用触发器。
答案 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/