如何从SQL Server表

时间:2018-06-15 19:54:06

标签: sql-server amazon-web-services migration amazon-redshift ddl

我试图创建一个自动管道来将数据从SQL Server表传输到我的Redshift数据库。我需要为几个表执行此操作,目前在SQL Server中。

我正在为此做的过程是:

  1. 使用.bat脚本自动将数据从SQL Server表中导出为CSV(映射到AWS S3存储桶的文件夹)。
  2. 编写一个Lambda函数来监视S3存储桶中的文件,将其加载到Redshift表中,然后在完成后从存储桶中删除该文件。
  3. 以上将是每日转储仅加载自上次转储以来的新记录。现在,在开始这个管道之前,我想知道:

    是否可以使用SQL Server表在我的Redshift数据库中自动创建表?或者某些东西将生成一个与SQL Server表中的Redshift表兼容的create table定义?因为,我需要为多个表格执行此操作并且表格非常庞大,我不想在Redshift中为每个表格手动执行"CREATE TABLE .."

    请帮助!!

2 个答案:

答案 0 :(得分:1)

这正是AWS Database Migration Service的用例,它可以执行初始迁移,但也可以执行正在进行的增量加载(但需要运行DMS服务器)。

请参阅:

要在Amazon Redshift中创建等效架构,您可以使用AWS Schema Conversion Tool,它将现有数据库架构从一个数据库引擎转换为另一个数据库引擎

答案 1 :(得分:0)

正如John所说,AWS数据库迁移服务将是将表从一个源DB复制到另一个目标数据库的最佳方式。

如果您仍在寻找获得等效的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