【问题标题】:How to Rename Two Tables in One Atomic Operation in MS SQL Server如何在 MS SQL Server 的一个原子操作中重命名两个表
【发布时间】:2021-07-16 18:46:08
【问题描述】:

我已经用更新的数据建立了一个新的临时表,我想用新的临时表替换现有的参考表。在 MS SQL Server 中,我如何以原子方式执行此操作,以便引用表对访问数据库的其他进程永远无效。

(My SQL 的类似问题:How to rename two tables in one atomic operation in MySQL

【问题讨论】:

  • 只使用一个事务。其他进程将被阻塞,直到操作完成。
  • 这是关于重命名 ms 服务器中的表的文档的链接 link
  • “使用交易” - 当你大声说出来时很明显:) 谢谢
  • 另一个选项可以在表格顶部查看。和单身ALTER VIEW constant_name AS SELECT ... FROM new_tab_name
  • ALTER TABLE ... SWITCH 是一个非常酷的功能,不需要企业版,请参阅stackoverflow.com/a/66429140/14868997 在任何时候都不存在任何表

标签: sql-server


【解决方案1】:

作为参考,这是我从上面@Alejandro 的评论中得出的解决方案:

BEGIN TRANSACTION
DROP TABLE ReferenceData
EXEC sp_rename 'NewReferenceData', 'ReferenceData'
COMMIT

【讨论】:

    【解决方案2】:

    如果临时表一模一样,可以使用分区切换。

    您不需要企业版,也不需要对表进行分区。

    表需要具有相同列定义(包括精度/长度/排序规则)、相同的聚集非聚集索引,最重要的是,相同的文件组,因此它们不能是临时表或表变量

    这种技术速度极快,不会对其他查询表的人造成缺失对象错误。

    SET XACT_ABORT, NOCOUNT ON;      -- force immediate rollback if session is killed
    
    BEGIN TRAN;
    
    TRUNCATE TABLE myTargetTable;    -- target must be empty
    
    ALTER TABLE myStaging SWITCH TO myTargetTable
    WITH (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 1 MINUTES, ABORT_AFTER_WAIT = BLOCKERS));
    
    -- not strictly necessary to use WAIT_AT_LOW_PRIORITY but better for blocking
    -- use SELF instead of BLOCKERS to kill your own session
    
    -- Set MAX_DURATION to 0 to force blockers off immediately
    
    COMMIT TRAN;
    

    详情请见this answer

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 2010-11-18
      • 1970-01-01
      • 2015-03-14
      • 2016-10-07
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多