【问题标题】:Swapping stage and prod tables in sql server在 sql server 中交换 stage 和 prod 表
【发布时间】:2018-03-20 15:13:19
【问题描述】:

作为 ETL 过程的一部分,我正在尝试将暂存表“翻转”到 SQL Server 中的生产表,但需要整理出一些有关处理外键的更详细的细节。我正在创建的 ETL 流程遵循以下模式:

  1. 截断阶段表
  2. 使用 Prod 数据加载 Stage 表
  3. 在阶段表中进行插入/更新
  4. 交换 stage 和 prod 表

例如,我有 4 个表、2 个 prod 和 2 个 stage。

CREATE TABLE [Table_1]
( 
    [table_1_sk]         integer  NOT NULL ,
    [column_a]           varchar(20)  NULL ,
    [column_b]           varchar(20)  NULL ,
    [column_c]           varchar(20)  NULL ,
    PRIMARY KEY  CLUSTERED ([table_1_sk] ASC)
)
go
CREATE TABLE [Table_2]
( 
    [table_2_sk]         integer  NOT NULL ,
    [table_1_sk]         integer  NOT NULL ,
    [column_d]           varchar(20)  NULL ,
    [column_e]           varchar(20)  NULL ,
    [column_f]           varchar(20)  NULL ,
    PRIMARY KEY  CLUSTERED ([table_2_sk] ASC),
     FOREIGN KEY ([table_1_sk]) REFERENCES [Table_1]([table_1_sk])
)
go
CREATE TABLE [stage_Table_1]
( 
    [table_1_sk]         integer  NOT NULL ,
    [column_a]           varchar(20)  NULL ,
    [column_b]           varchar(20)  NULL ,
    [column_c]           varchar(20)  NULL ,
    PRIMARY KEY  CLUSTERED ([table_1_sk] ASC)
)
go
CREATE TABLE [stage_Table_2]
( 
    [table_2_sk]         integer  NOT NULL ,
    [table_1_sk]         integer  NULL ,
    [column_d]           varchar(20)  NULL ,
    [column_e]           varchar(20)  NULL ,
    [column_f]           varchar(20)  NULL ,
    PRIMARY KEY  CLUSTERED ([table_2_sk] ASC)
)
go

我开始使用 sp_rename 来简单地重命名表,但注意到外键没有与 prod 表保持一致。

有更好的方法吗?

【问题讨论】:

  • 您还必须为约束编写 sp_renames 脚本(除非您可以更改它们的命名约定)。
  • 只是好奇,为什么不放弃第 1、2 和 4 步,让第 3 步“在 prod 表中进行更新/插入”?这听起来容易多了。或者保留步骤 1-3并进行第 4 步“在 stage 和 prod 表之间运行合并”?这是由于表上的大改动而导致的一次性更改还是重复的 ETL 过程?
  • 请在使用 sp_rename 之前阅读这篇文章。 littlekendra.com/2017/01/19/…
  • dfundako,我遵循这种设计模式来保护“实时”表免受 ETL 过程中的任何故障。这是一个反复发生的过程。

标签: sql sql-server


【解决方案1】:

当我必须采用这种方法时,我会按照您的描述准备好一切。假设我的实时表是myTable,我计划切换的表称为myTable_New。那么我会:

  1. 打开显式事务和错误块
  2. sp_renamemyTable 到 myTable_Old
  3. sp_renamemyTable_New to myTable
  4. 提交事务

此时,表已切换,暂存表现在已替换活动表。您现在可以在闲暇时完成(即在您重命名活动表时的阻塞期之外)并重命名您想要修复名称的任何约束。所以补充一点:

  1. 删除 myTable_old 或 sp_rename myTable_Old 上的所有约束并添加后缀“_Old”(这样在重命名它们时它们不会与新表的约束冲突)
  2. sp_rename myTable_Old 上的所有约束删除“_Old”后缀

【讨论】:

  • 在第 4 步之后,约束现在位于您的 myTable_New 上,而不再位于实时 myTable 上,第 5 步和第 6 步将简单地重命名 FK 约束,而不是重新指向它。对吗?
  • 约束与原始对象保持一致。因此,如果我有一个带有约束 myFK_Old 的表 myTable_Old,当我将 sp_rename myTable_Old 变为 myTable 时,该表上仍然会有约束 myFK_Old。重命名父对象不会解除约束。但它也不会对这些约束应用重命名(这就是为什么你必须单独这样做)。
  • 这就是我所看到的,所以我需要与 sp_renames 一起删除/添加约束。所以它看起来像:sp_rename > commit > drop constraint > add constraint
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多