如何从 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 中生成表的数据脚本文件?

如何使用 SQL Server Data Tools 覆盖数据库表数据

sql server如何如何从一个表中提取部分资讯插入到另一表中

SQL Server 2012 生成的脚本无法再次运行?