1

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

我的解决方案从 beta 服务器转储数据并在生产中恢复。
缺陷:我必须首先删除生产中的所有数据,并且由于外键而存在问题(我可以先关闭键,但有没有办法避免它?)。

我发现了类似的问题,其中一个答案建议使用dblink命令。我想我可以写更新语句,但这似乎还是有点矫枉过正。

编辑(补充说明):
有生产服务器(我们称之为Production),有开发服务器(我们称之为Beta)。所以我需要在生产上更改一些数据(3 个相互连接的表,它们也被数据库中的其他表引用)。准确地说 - 这些表格包含学习计划 - 主题、主题组和子主题。有引用这些元素的寄存器。但我需要立即完成这些更改(意思是:通过 SQL 脚本)。为了实现这一点,我将使用 Beta 服务器 - 它拥有生产数据库的副本(在特定时刻完成,没有实时同步)。所以我将在 Beta 服务器上的 3 个表中更新数据,我需要将这些数据移动到生产环境。

4

2 回答 2

2

我们在维护生产数据库时通常会编写一个 SQL 脚本来执行更新、删除、设置等操作。我们针对 Beta 测试它,它应该是 Production 的一个很好的副本。

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

我们不会将数据从非生产环境转移到生产环境中。生产是数据的主人,复制一份,进行更新,然后尝试重新加载它是困难和可怕的(正如你已经想通的)。

这种机制使我们能够确保运行经过测试的脚本,这将使已知的更新投入生产。它消除了人为错误,因为当您连接到生产环境时,您所要做的只是脚本的名称。

于 2013-06-08T00:40:46.680 回答
1

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

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

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

    插入 INTO Pro_Table SELECT * FROM New_Rows_Table

    UPDATE Prod_Table set Prod_Col_1 = Upd_tbl_c1, Prod_Col_2 = Upd_tbl_c2, ... , Prod_Col_N = Upd_tbl_cN from Update_Table where Prod_Table.RowKey = Update_Table.RowKey

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

这是 SQL Server 代码风格,但您可以理解并进行必要的更改。例如 Delete_Table 应该只有 RowKey 列。

如果您不能创建唯一键。你有一些选择:

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

或者

锁定您的数据库以进行任何更改,或者不应用它们并单独存储。在您的更改提升到 后Production,应用延迟更改。

或者

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

在对Beta复制行进行更改时,您手动更改Beta为单独的表。

完成更改后,查看从中捕获的数据Production并决定如何将它们应用到您已更改并从中复制的行Beta

为避免外键出现问题,请以不同的名称复制/导入更新后的表。重命名原始表,然后重新命名。删除原始表。这样您就不会删除任何数据,并且始终强制执行所有外键。

于 2013-06-05T10:56:06.340 回答