从另一个DB更新表

时间:2013-05-28 20:38:47

标签: sql postgresql-8.3

我需要更改三个表中的数据(更新一些现有行,添加一些新行,删除一些旧行)。我需要在一瞬间完成它。问题是需要手动更改数据,可能需要一些时间才能完成。所以我将使用beta服务器进行更改。问题是:如何使用其他数据库中的数据更新生产服务器?

我的解决方案从测试版服务器转储数据并在生产时将其恢复。
缺陷:我必须首先删除生产中的所有数据,因为外键会有问题(我可以先关闭密钥,但是有办法避免它吗?)。

我找到similar question,其中一个答案建议使用dblink命令。我想我可以写更新声明,但这似乎有点矫枉过正。

编辑(附加说明):
有生产服务器(我们称之为Production),还有开发服务器(我们称之为Beta)。所以我需要在Production上更改一些数据(3个表是互连的,它们也是从DB中的其他表引用的)。确切地说 - 这些表包含学习计划 - 主题,主题组和子主题。有些寄存器涉及这些元素。但我需要在一瞬间完成这些更改(意思是:通过SQL脚本)。为了实现这一点,我将使用Beta服务器 - 它包含生产数据库的副本(在某个时刻完成,没有实时同步)。因此,我将在Beta服务器上的3个表中更新数据,我需要将此数据移至Production。

2 个答案:

答案 0 :(得分:2)

当我们维护生产数据库时,我们通常做的是编写一个SQL脚本来执行更新,删除,设置。我们针对Beta测试它,这应该是一个非常好的生产副本。

当我们确定它正在做正确的事情时,我们会反对生产。

我们将数据从非生产环境转移到生产环境中。制作是数据的主人,制作副本,进行更新,然后尝试将其重新加载是困难和可怕的(正如您已经想到的那样)。

这种机制允许我们确保运行经过测试的脚本,这将使生成中的已知更新。它消除了人为错误,因为当你连接到生产时你必须要做的就是脚本的名称。

答案 1 :(得分:1)

您的策略取决于您识别唯一行的能力。

如果您可以为每一行创建一个唯一键(不必创建UNIQUE约束),那么:

  1. 将所有数据复制到Beta。通过标记受影响的行或创建NEWUPDATEdDELETEd表来进行更改。
  2. 仅将标记的行复制到Production
  3. 应用更改。如果你发现自你的副本以来Production行已被更改 - 请决定如何处理它。

    插入INTO Pro_Table SELECT * FROM New_Rows_Table

    更新Prod_Table 设置Prod_Col_1 = Upd_tbl_c1, Prod_Col_2 = Upd_tbl_c2, ......, Prod_Col_N = Upd_tbl_cN 来自Update_Table 其中Prod_Table.RowKey = Update_Table.RowKey

    从Prod_Table删除 FROM Delete_Table 其中Prod_Table.RowKey = Delete_Table.RowKey

  4. 这是SQL Server代码样式,但您可以获得想法并进行必要的更改。例如,Delete_Table应该只有RowKey列。

    如果无法创建唯一键。你有一些选择:

    通过添加新列并使用Row_Number()函数填充它来为所有行编号。

    OR

    锁定您的数据库以进行任何更改,或者不应用它们并单独存储。将您的更改提升为Production后,请应用默认更改。

    OR

    使用触发器捕获INSERT数据库上的所有DELETE,'UPDATE'和Production语句。您需要插入,因为它们可能会受到更新和删除的影响。

    Beta副本行进行更改时,您会在Beta上手动更改为单独的表格。

    完成更改后,请检查Production中捕获的数据,并决定如何将这些数据应用于您已更改并从Beta复制的行。

    要使用外键的avioid问题,请使用其他名称复制/导入更新的表。重命名原始表,然后重新创建新表。删除原始表。这样就不会删除任何数据,并且所有外键都会一直强制执行。