【发布时间】:2018-03-20 15:13:19
【问题描述】:
作为 ETL 过程的一部分,我正在尝试将暂存表“翻转”到 SQL Server 中的生产表,但需要整理出一些有关处理外键的更详细的细节。我正在创建的 ETL 流程遵循以下模式:
- 截断阶段表
- 使用 Prod 数据加载 Stage 表
- 在阶段表中进行插入/更新
- 交换 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