在线模式修改

Fir*_*one 3 t-sql sql-server

我在SQL Server上有一个名为BigData的表。BigData由应用程序连续修改,即使一秒钟也无法离线。另一个要求是该表只能由访问它的应用程序以外的其他进程锁定。问题是; 如何将BigData的一列从Bigint更改为int?有什么建议么?

Tim*_*sen 5

最近我在贝宝(PayPal)面试中也遇到了一个与此非常类似的问题。这种情况对于银行或电子商务公司来说是很常见的,因为该公司具有经常使用的实时数据库。

我给出的答案是:

  1. 根据该BigData表创建一个新表,该表看起来相同,只是该列具有新类型。
  2. 创建一个触发器,该触发器将在每次对旧表进行更新或插入时触发。触发器将适当地更新/插入新表
  3. 开始将所有记录从旧表复制到新表中,这些记录早于触发器上线的时间。由于触发器覆盖了新记录,因此此步骤将重叠。
  4. 一旦所有旧记录已成功复制到新表中,我们可以期望新表现在具有所有旧记录,以及自开始迁移过程以来插入/更新的所有新记录。

完成此操作后,新表和旧表应具有相同的内容,并且两者都应与正在运行的应用程序同步。现在,可以删除旧表,并且可以将新表重命名为旧表。可能需要短暂中断(例如几分钟)以实现此目的,但这应该可以接受。