当组织试图从本地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