Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅在两个数据库之间复制数据_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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

Sql 仅在两个数据库之间复制数据,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我试图只在两个SQL server 2008数据库之间复制数据。我需要保持现有存储的进程和函数完好无损,只复制数据。DB模式是相同的,但我遇到了PK的问题 我首先尝试: EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' EXEC sp_MSForEachTable 'DELETE FROM ?' 删除所有数据。但是得到 Failure inserting into the read-only column 因此,我随

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

如果只在两个数据库之间导出数据,而保留原始过程和函数不变,那么最好的方法是什么

谢谢


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

只需从第二个数据库中的所有表pkey中删除标识规范

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


无论如何,您都不希望pkey在第二个db中作为标识pkey,那么,所有外键都无法工作。

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

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


无论如何,您不会希望pkey在第二个db中作为标识pkey,那么,您的所有外键都不会工作。

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

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

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

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

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


  • 您得到的错误看起来不像PK冲突或身份问题。我看到两个可能的原因:

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

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


  • 最后,我对这两个答案都有了不同的看法。我使用第三个数据库作为临时数据库

    1) 我对我需要的数据库进行了完整备份(实时)
    2) 我已将此备份还原到我的临时数据库。
    3) 我编写了我需要的数据库的脚本,只编写了过程和函数的脚本,并使用DROP和IF INCLUDES编写了脚本。
    4) 我在temp数据库上运行了来自#3的脚本,提供了来自DB1的数据以及来自DB2的procs和func
    5) 我使用临时数据库备份中的覆盖恢复了DB2。


    谢谢大家,如果可以的话,我会把所有的答案都标记为正确的。

    我最后给出了两个答案的变化。我使用第三个数据库作为临时数据库

    1) 我对我需要的数据库进行了完整备份(实时)
    2) 我已将此备份还原到我的临时数据库。
    3) 我编写了我需要的数据库的脚本,只编写了过程和函数的脚本,并使用DROP和IF INCLUDES编写了脚本。
    4) 我在temp数据库上运行了来自#3的脚本,提供了来自DB1的数据以及来自DB2的procs和func
    5) 我使用临时数据库备份中的覆盖恢复了DB2。


    谢谢大家,如果我可以的话,我会把所有的都标记为正确的。

    嗨,为了摆脱你的限制,请阅读我写的这篇关于这个主题的博文


    嗨,为了摆脱你的约束,请阅读我写的这篇关于这个主题的博文


    看起来您不需要在第二个表中保留现有数据,只需在第一个表中创建数据的精确副本即可。正确吗?不,目标数据库将没有数据,但我需要保持过程和函数的完整性。我要用DELETE FROM删除目标数据库?上级指挥部;在我开始之前,它会有数据。因此,它将是一个包含数据的空数据库。看起来您不需要在第二个表中保留现有数据,只需要在第一个表中创建数据的精确副本。正确吗?不,目标数据库将没有数据,但我需要保持过程和函数的完整性。我要用DELETE FROM删除目标数据库?上级指挥部;在我开始之前,它会有数据。因此,它将是一个包含数据的空数据库。是否有一种全局方法可以轻松地恢复?谢谢,有没有一种全球性的方法可以让我很容易恢复?感谢您编辑您的答案,更明确地定义对应关系