重命名旧表,然后填充新版本,以使表停机时间最小化?

mg1*_*075 4 sql t-sql relational-database sql-server-2008

我只有少数几个永久性的桌子,需要每晚进行重建。

为了使这些表尽可能长时间保持“活动”状态,并提供仅备份前一天数据的可能性,另一位开发人员隐约地建议在夜间构建时采用类似的方法:

  1. 创建一个永久表(构建版本;例如,tbl_build_Client)

  2. 重命名活动表(tbl_Client被重命名为tbl_Client_old)

  3. 将构建版本重命名为实时版本(tbl_build_Client重命名为tbl_Client)

要重命名表,将使用sp_rename。
http://msdn.microsoft.com/en-us/library/ms188351.aspx

您是否看到任何更有效的方法来解决此问题,或者该方法存在严重缺陷?提前致谢。


更新资料

试图冲刷gbn的答案和建议以使用同义词,这是一种合理的方法,还是我得到了一些可怕的错误?

“客户”的三个真实表:
1. dbo.build_Client
2. dbo.hold_Client
3. dbo.prev_Client

由于“客户端”是其他proc引用“客户端”数据的方式,因此默认同义词为

CREATE SYNONYM         Client  
FOR           dbo.hold_Client
Run Code Online (Sandbox Code Playgroud)

然后采取以下步骤刷新数据,但保持不间断的访问。
(1.a。)TRUNCATE dbo.prev_Client(具有昨天的数据)
(1.b。)INSERT INTO dbo.prev_Client来自dbo.build_Client的记录,因为dbo.build_Client仍然具有昨天的数据

(2.a.)TRUNCATE dbo.build_Client
(2.b.) INSERT INTO dbo.build_Client从新数据构建过程
(2.c.)的新数据构建更改同义词

DROP SYNONYM           Client
CREATE SYNONYM         Client  
FOR          dbo.build_Client
Run Code Online (Sandbox Code Playgroud)

(3.a.)TRUNCATE dbo.hold_Client
(3.b.)dbo.build_Client (3.c.)中 INSERT INTO dbo.hold_Client的记录
更改了同义词

DROP SYNONYM          Client
CREATE SYNONYM        Client  
FOR          dbo.hold_Client
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 5

使用间接避免直接操作表:

  • 有3个表:Client1,Client2,Client3,其中包含所有索引,约束和触发器等
  • 使用同义词隐藏真实表,例如Client,ClientOld,ClientToLoad
  • 要生成新表,请截断/写入“ ClientToLoad”
  • 然后,您在事务中删除和创建同义词,以便
    • 客户端->什么是ClientToLoad
    • ClientOld->什么是Client
    • ClientToLoad->什么是ClientOld

您可以用来SELECT base_object_name FROM sys.synonyms WHERE name = 'Client'计算当前的间接寻址是什么

这适用于所有版本的SQL Server:另一种方法是“分区切换”,它需要企业版