如何从 SQL Server 表生成 Reshift 兼容表架构
Posted
技术标签:
【中文标题】如何从 SQL Server 表生成 Reshift 兼容表架构【英文标题】:How to generate Reshift compatible table schema from a SQL Server table 【发布时间】:2018-06-15 19:54:05 【问题描述】:我正在尝试创建一个自动化管道以将数据从 SQL Server 表传输到我的 Redshift 数据库。我需要对目前在 SQL Server 中的几个表执行此操作。
我正在做的过程是:
-
使用 .bat 脚本自动将 SQL Server 表中的数据导出为 CSV(到映射到 AWS S3 存储桶的文件夹中)。
编写一个 Lambda 函数来监视 S3 存储桶中的文件将其加载到 Redshift 表中,然后在完成后从存储桶中删除该文件。
以上将是每日转储,仅加载自上次转储以来的新记录。现在,在启动这条管道之前,我想知道:
是否可以使用 SQL Server 表在我的 Redshift 数据库中自动创建表?或者会生成与 SQL Server 表中的 Redshift 表兼容的创建表定义的东西?因为,我需要为多个表执行此操作,而且这些表非常大,所以我不想在 Redshift 中为每个表手动执行"CREATE TABLE .."
。
请帮忙!!
【问题讨论】:
【参考方案1】:这正是AWS Database Migration Service 的用例,它可以进行初始迁移,但也可以执行持续的增量加载(但需要运行 DMS 服务器)。
见:
Using a Microsoft SQL Server Database as a Source for AWS DMS - AWS Database Migration Service Using an Amazon Redshift Database as a Target for AWS Database Migration Service - AWS Database Migration Service要在 Amazon Redshift 中创建等效架构,您可以使用 AWS Schema Conversion Tool,它将现有数据库架构从一个数据库引擎转换为另一个
【讨论】:
【参考方案2】:正如 John 所提到的,AWS Database Migration Service 将是将表从一个源数据库复制到另一个目标数据库的最佳方式。
如果您仍然只是在寻找等效的 redshift create table DDL,您可以使用元数据表来获得它。我为 Oracle 做了同样的事情来红移并为所有表循环:
WITH COLUMN_DEFINITION AS (
SELECT
TABLE_NAME,
COLUMN_NAME,
CASE
WHEN (DATA_TYPE= 'NUMBER' AND DATA_SCALE = 0 AND DATA_PRECISION <= 9) THEN 'INTEGER'
WHEN (DATA_TYPE= 'NUMBER' AND DATA_SCALE = 0 AND DATA_PRECISION <= 18) THEN 'BIGINT'
WHEN (DATA_TYPE= 'NUMBER' AND DATA_SCALE = 0 AND DATA_PRECISION >= 19) THEN 'DECIMAL(' || DATA_PRECISION || ',0)'
WHEN (DATA_TYPE= 'NUMBER' AND DATA_SCALE > 0) THEN 'DECIMAL(' || DATA_PRECISION || ',' || DATA_SCALE ||')'
WHEN (DATA_TYPE= 'NUMBER' AND nvl(DATA_SCALE,0) = 0 AND nvl(DATA_PRECISION,0) = 0) THEN 'DECIMAL(38,18)'
WHEN DATA_TYPE= 'CHAR' THEN 'VARCHAR(' || DATA_LENGTH || ')'
WHEN DATA_TYPE= 'VARCHAR' THEN 'VARCHAR(' || DATA_LENGTH || ')'
WHEN DATA_TYPE= 'VARCHAR2' THEN 'VARCHAR(' || DATA_LENGTH || ')'
WHEN DATA_TYPE= 'DATE' THEN 'TIMESTAMP'
WHEN DATA_TYPE= 'DATETIME' THEN 'TIMESTAMP'
WHEN DATA_TYPE LIKE 'TIMESTAMP%' THEN 'TIMESTAMP'
WHEN DATA_TYPE= 'LONG' THEN 'TEXT'
WHEN DATA_TYPE= 'CLOB' THEN 'TEXT'
WHEN DATA_TYPE LIKE '%RAW%' THEN 'TEXT'
WHEN DATA_TYPE= 'NCHAR' THEN 'NCHAR(' || DATA_LENGTH || ')'
WHEN DATA_TYPE= 'NVARCHAR' THEN 'NVARCHAR(' || DATA_LENGTH || ')'
ELSE DATA_TYPE || '(' || DATA_LENGTH || ')'
END AS REDSHIFT_COLUMN_DEFINITION
FROM ALL_TAB_COLUMNS
WHERE LOWER(OWNER)= LOWER('<schma_name>') AND LOWER(TABLE_NAME) in
LOWER('<Table name>')
ORDER BY COLUMN_ID
)
SELECT 'drop table if exists ' || LOWER(MAX(TABLE_NAME)) || ' cascade; '
FROM column_definition
UNION ALL
SELECT 'create table '|| LOWER(MAX(TABLE_NAME)) || ' (' AS TEXT FROM
COLUMN_DEFINITION
UNION ALL
SELECT ' '|| LOWER(COLUMN_NAME) ||' '|| REDSHIFT_COLUMN_DEFINITION
|| ', ' AS TEXT FROM COLUMN_DEFINITION
UNION ALL
SELECT ' );' AS TEXT FROM DUAL
【讨论】:
以上是关于如何从 SQL Server 表生成 Reshift 兼容表架构的主要内容,如果未能解决你的问题,请参考以下文章
如何从事件日志表计算 SQL Server 中的平均队列长度
如何使用存储过程在 SQL Server 中生成表的数据脚本文件?
如何使用 SQL Server Data Tools 覆盖数据库表数据