雪花云数据平台- DDL脚本自动生成



当组织试图从本地Teradata实时迁移到Snowflake时,如何在Snowflake中创建所有对象?(数据库,模式,表和视图等)。

显然不能手动创建每个对象。(假设有5000多张桌子)。DDL脚本的自动生成是如何实时完成的?我也尽量避免使用任何第三方工具,如Roboquery。

是的,我们可以使用GET_DDL()函数生成DDL脚本

您可以在

下面找到更多信息https://docs.snowflake.com/en/sql-reference/functions/get_ddl.html

你可能在寻找这样的东西吗?

这将需要更多的工作来自动化这个过程,但这是一个想法:遍历信息模式以获取每种类型DB/Table/Proc/View等的所有ddl内容。

然后自动将结果推送到一个文件,然后你可以有一个完整的"Rebuild"根据您的需要编写脚本。希望这能让你找到你想要的东西。

USE DATABASE SNOWFLAKE;
SELECT (
'USE DATABASE ' || CHAR(39) || DB.DATABASE_NAME || CHAR(39) || ';  ' ||
'SELECT GET_DDL(' || CHAR(39) || 'DATABASE' || CHAR(39) ||',' || CHAR(39) || DB.DATABASE_NAME || CHAR(39) || ', 1);' ||  CHAR(13) || CHAR(10)
) AS SHOW_DATABASE_DDLS 
FROM INFORMATION_SCHEMA.DATABASES AS DB;

它将生成所有的可能性:

-- EXAMPLE
-- USE DATABASE 'ONEOFYOURDBS';  SELECT GET_DDL('DATABASE','ONEOFYOURDBS', 1);

下一层是表/视图,这受到每个数据库的限制,所以你必须更改数据库,然后你可以为每个数据库运行这些,以获得所有DDL的

USE DATABASE TESTDATABASE;
WITH CONFIG AS (
SELECT
'%'        AS TGT_DATABASE_FILTER
, '%'        AS TGT_SCHEMA_FILTER
, '%'        AS TGT_TABLE_FILTER
)
SELECT 
(
'/* =============================== AUTO-GENERATED FROM SCRIPT BEGIN =============================== */'       || CHAR(13) || CHAR(10) ||
'SELECT GET_DDL(' || CHAR(39) || 'TABLE' || CHAR(39) ||', ' || CHAR(39) || CHAR(34) || 
T.TABLE_CATALOG|| CHAR(34) || '.' || CHAR(34) || T.TABLE_SCHEMA || CHAR(34) || '.' || CHAR(34) || T.TABLE_NAME || CHAR(34) || CHAR(39) || ', 1);' || CHAR(13) || CHAR(10) ||
'/* =============================== AUTO-GENERATED FROM SCRIPT END   =============================== */'      || CHAR(13) || CHAR(10) 
) AS INSERT_DML
FROM INFORMATION_SCHEMA.TABLES          AS T
CROSS JOIN CONFIG                       AS C
WHERE UPPER(T.TABLE_TYPE)       = 'BASE TABLE'
AND TABLE_SCHEMA             != 'INFORMATION_SCHEMA'
AND UPPER(T.TABLE_NAME)      LIKE UPPER(C.TGT_TABLE_FILTER)
AND UPPER(T.TABLE_SCHEMA)    LIKE UPPER(C.TGT_SCHEMA_FILTER)
;

generate:(THE, 1生成完整的限定路径)

/* =============================== AUTO-GENERATED FROM SCRIPT BEGIN =============================== */
SELECT GET_DDL('TABLE', '"TESTDATABASE"."TESTSCHEMA"."TESTTABLE"', 1);
/* =============================== AUTO-GENERATED FROM SCRIPT END   =============================== */

指出:

-- FYI 
SELECT CHAR(39);  -- SINGLE QUOTE
SELECT CHAR(34);  -- DOUBLE QUOTE
SELECT CHAR(13);  -- CARRIAGE RETURN
SELECT CHAR(10);  -- NEW LINE/LINE BREAK

最新更新