代码之家  ›  专栏  ›  技术社区  ›  Jammin

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

  •  0
  • Jammin  · 技术社区  · 15 年前

    我试图只在两个SQL server 2008数据库之间复制数据。我需要保持现有的存储过程和函数完整,只复制数据。数据库模式是相同的,但im遇到了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'
    

    什么是只在两个数据库之间导出数据的最佳方式,而不破坏原始进程和函数?

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

    5 回复  |  直到 15 年前
        1
  •  1
  •   Cahit    15 年前

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

        2
  •  2
  •   Lill Lansey    15 年前

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

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

        3
  •  1
  •   Alberto Martinez    15 年前

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

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

    2. 如果在delete步骤中遇到错误,可能有一个触发器在delete时触发,它试图插入数据,但由于某种原因失败(这些触发器的思想是在另一个位置维护已删除数据的副本)。如果是这样,请修复插入或禁用触发器。

        4
  •  0
  •   Jammin    15 年前

    最后我对两个答案都作了不同的回答。我用第三个数据库作为临时数据库。


    2) 我已将此备份还原到临时数据库。
    3) 我用DROP和IF INCLUDES编写了我需要的过程和函数的数据库脚本,只编写了过程和函数的脚本。
    4) 我对temp数据库运行了#3中的脚本,给出了来自DB1的数据以及来自DB2的procs和func
    5) 我使用temp数据库备份中的OVERWRITE恢复了DB2。

    谢谢,如果可以的话,我会把所有的标记都标对的。

        5
  •  0
  •   Mark Broadbent    15 年前

    嗨,为了解决你的问题与你的限制,请阅读我写的这篇博客文章的主题。

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

    推荐文章