- 类别:
GET_DDL¶
返回可用于重新创建指定对象的 DDL 语句。对于数据库和模式,GET_DDL 是递归的(即,它返回 DDL 语句,用于在指定数据库/架构中重新创建所有支持对象)。
GET_DDL 目前支持以下对象类型:
警告(请参阅 CREATE ALERT)
数据库(请参阅 CREATE DATABASE)
动态表(请参阅 CREATE DYNAMIC TABLE)
事件表(请参阅 CREATE EVENT TABLE)
外部表(请参阅 CREATE EXTERNAL TABLE)
文件格式(请参阅 CREATE FILE FORMAT)
Iceberg 表(请参阅 CREATE ICEBERG TABLE)。
管道(请参阅 CREATE PIPE)
政策(请参阅 CREATE AGGREGATION POLICY、CREATE AUTHENTICATION POLICY、CREATE MASKING POLICY、CREATE PASSWORD POLICY、CREATE PROJECTION POLICY、CREATE ROW ACCESS POLICY、CREATE SESSION POLICY)
架构(请参阅 CREATE SCHEMA)
序列(请参阅 CREATE SEQUENCE)
存储集成(请参阅 CREATE STORAGE INTEGRATION)
存储过程(请参阅 CREATE PROCEDURE)
流(请参阅 CREATE STREAM)
表(请参阅 CREATE TABLE)
标签(请参阅 CREATE TAG)
任务(请参阅 CREATE TASK)
UDFs,包括外部函数(请参阅 CREATE FUNCTION)
视图(请参阅 CREATE VIEW)
语法¶
GET_DDL( '<object_type>' , '[<namespace>.]<object_name>' [ , <use_fully_qualified_names_for_recreated_objects> ] )
实参¶
必填:
object_type
指定为其返回 DDL 的对象的类型。有效值(对应于支持的对象类型)为:
DATABASE
DYNAMIC_TABLE
EVENT_TABLE
FILE_FORMAT
FUNCTION(适用于 UDFs,包括外部函数)
ICEBERG_TABLE
INTEGRATION(存储)
PIPE
POLICY(聚合、身份验证、掩码、密码、投影、行访问和会话策略)
PROCEDURE(适用于存储过程)
SCHEMA
SEQUENCE
STREAM
TABLE(包括外部表)
TAG(对象标签)
TASK
VIEW(包括物化视图)
namespace.object_name
指定为其返回 DDL 的对象的完全限定名称。
命名空间是对象所在的数据库和/或架构:
不适用于数据库。
对于架构,采用
database
的形式。对于架构对象(表、视图、流、任务、序列、文件格式、管道、策略和 UDFs),采用
database.schema
或schema
的形式。
如果数据库和架构当前正在用户会话中使用,则命名空间为 可选;否则,为必需。
可选:
use_fully_qualified_names_for_recreated_objects
如果为
TRUE
,则生成的 DDL 语句为要重新创建的对象使用完全限定名称。默认:
FALSE
。备注
此参数不影响 DDL 语句中引用的其他对象的名称(例如,视图定义中引用的表的名称)。
返回¶
返回字符串 (VARCHAR
),其中包含用于创建对象的 DDL 语句的文本。
对于 UDFs 和存储过程,输出可能与原始 DDL 略有不同。例如,如果 UDF 或存储过程包含 JavaScript 代码,则 JavaScript 代码周围的分隔符字符可能不同。此外,如果原始 CREATE PROCEDURE
语句未指定 EXECUTE AS OWNER
或 EXECUTE AS CALLER
,则 GET_DDL
的输出包含 EXECUTE AS OWNER
,因为这是默认值。
使用说明¶
以下说明适用于所有支持对象:
object_type
和object_name
(包括namespace
,如果已指定)必须放在单引号内。对于
object_type
,TABLE
和VIEW
可互换。如果指定TABLE
对象类型,并且按名称指定的对象是视图,则函数返回视图的 DDL,反之亦然。如果
object_type
是FUNCTION
(即 UDF)并且 UDF 包含实参,您必须将实参数据类型作为函数名称的一部分包含在内,形式为'function_name( [ arg_data_type [ , ... ] ] )'
,其中function_name
是函数的名称,arg_data_type
是实参的数据类型。如果
object_type
是PROCEDURE
,并且存储过程包含实参,您必须将实参数据类型作为函数名称的一部分包含在内,形式为'procedure_name( [ arg_data_type [ , ... ] ] )'
。如果指定的
TABLE
对象是 Iceberg 表,函数将返回 Iceberg 表的 DDL。要为大多数 Snowflake 对象类型查询此函数,需要查看对象所需的相同最低权限(使用 DESCRIBE <object> 或 SHOW <objects>)。Snowflake 仅限所有者(即具有对象的 OWNERSHIP 权限的角色)查看特殊对象(例如安全视图)。
以下说明特定于视图对象:
查询结果始终:
为
create or replace view
返回小写 SQL 文本,即使用于创建视图的原始 SQL 语句采用大写或混合大小写也如此。包括
OR REPLACE
子句。如果视图安全,则包括
SECURE
属性。排除
COPY GRANTS
视图参数,即使原始 CREATE VIEW 语句指定COPY GRANTS
参数也如此。生成列列表。
如果在列上设置了掩码策略,则结果将指定该列的掩码策略。
移除视图正文(即
AS
)之前的内联 SQL 注释。例如,在下面的代码中,移除了紧跟在 AS 子句前面的注释:create view view_t1 -- GET_DDL() removes this comment. AS select * from t1;
以下说明特别适用于带有标签或策略的表和视图对象:
执行 GET_DDL 查询的角色必须具有全局 APPLY MASKING POLICY、APPLY ROW ACCESS POLICY、APPLY AGGREGATION POLICY 或 APPLY PROJECTION POLICY 或 APPLY TAG 的权限,以及具有对包含策略或标签的数据库和架构的 USAGE 权限。否则,Snowflake 会将策略替换为
#UNKNOWN_POLICY
,并将标签替换为#UNKNOWN_TAG='#UNKNOWN_VALUE
。此文本指明列或对象受策略保护,并在对象或列上设置标签。如果在重新创建对象之前未移除此文本,则 CREATE OR REPLACE <object> 语句将失败。如果 GET_DDL 查询结果中存在此文本,则在重新创建对象之前,请咨询内部治理管理员,以确定列或对象需要哪些策略和标签。最后,编辑 GET_DDL 查询结果,然后重新创建对象。
如果没有上述权限,此表函数不会在调用函数的输出中返回策略和标签分配的相应行。
当在对象或列上设置多个标签时,GET_DDL 输出将按标签名称的字母顺序对标签进行排序。
删除标签会从 GET_DDL 输出中移除该标签。
如果在表或视图上设置标签,则表或视图的 GET_DDL 输出将包含 CREATE OR REPLACE 语句中的标签分配。
如果在列上设置掩码策略或在表上设置行访问策略,则 GET_DDL 输出包括使用
WITH
关键字的策略分配。
在数据库或架构上设置标签时,GET_DDL 输出包括:
在数据库上设置标签时的 ALTER DATABASE 语句。
在数据库和架构上同时设置标签时的 ALTER DATABASE 语句和 ALTER SCHEMA 语句。
在架构上设置标签时的 ALTER SCHEMA 语句。
用于生成标签的 CREATE OR REPLACE 语句(如果标签存在于数据库或架构中)。
以下内容适用于存储集成:
该命令总是返回 CREATE OR REPLACE STORAGE INTEGRATION 语法。
如果在创建存储集成时没有指定 STORAGE_AWS_EXTERNAL_ID,该命令将返回创建存储集成时自动生成的 ID。
排序规则详细信息¶
Collation information is included in the input.
示例¶
返回 DDL,用于创建名为 books_view
的视图:
SELECT GET_DDL('VIEW', 'books_view'); +-----------------------------------------------------------------------------+ | GET_DDL('VIEW', 'BOOKS_VIEW') | |-----------------------------------------------------------------------------| | | | CREATE OR REPLACE VIEW BOOKS_VIEW as select title, author from books_table; | | | +-----------------------------------------------------------------------------+
返回 DDL,用于创建名为 books_schema
的架构,以及架构中的对象(表 books_table
和视图 books_view
):
SELECT GET_DDL('SCHEMA', 'books_schema'); +-----------------------------------------------------------------------------+ | GET_DDL('SCHEMA', 'BOOKS_SCHEMA') | |-----------------------------------------------------------------------------| | CREATE OR REPLACE SCHEMA BOOKS_SCHEMA; | | | | CREATE OR REPLACE TABLE BOOKS_TABLE ( | | ID NUMBER(38,0), | | TITLE VARCHAR(255), | | AUTHOR VARCHAR(255) | | ); | | | | CREATE OR REPLACE VIEW BOOKS_VIEW as select title, author from books_table; | | | +-----------------------------------------------------------------------------+
返回 DDL,为要重新创建的对象使用完全限定名称:
SELECT GET_DDL('SCHEMA', 'books_schema', true); +---------------------------------------------------------------------------------------------------+ | GET_DDL('SCHEMA', 'BOOKS_SCHEMA', TRUE) | |---------------------------------------------------------------------------------------------------| | CREATE OR REPLACE SCHEMA BOOKS_DB.BOOKS_SCHEMA; | | | | CREATE OR REPLACE TABLE BOOKS_DB.BOOKS_SCHEMA.BOOKS_TABLE ( | | ID NUMBER(38,0), | | TITLE VARCHAR(255), | | AUTHOR VARCHAR(255) | | ); | | | | CREATE OR REPLACE VIEW BOOKS_DB.BOOKS_SCHEMA.BOOKS_VIEW as select title, author from books_table; | | | +---------------------------------------------------------------------------------------------------+
备注
如上面的示例所示,DDL 语句不为用于创建视图的表使用完全限定名称。要解析此表的名称,Snowflake 使用数据库的名称和视图的架构名称。
返回 DDL,用于创建名为 multiply
且具有两个 NUMBER
类型参数的 UDF :
SELECT GET_DDL('FUNCTION', 'multiply(number, number)'); +--------------------------------------------------+ | GET_DDL('FUNCTION', 'MULTIPLY(NUMBER, NUMBER)') | +--------------------------------------------------+ | CREATE OR REPLACE "MULTIPLY"(A NUMBER, B NUMBER) | | RETURNS NUMBER(38,0) | | COMMENT='multiply two numbers' | | AS 'a * b'; | +--------------------------------------------------+
返回 DDL,用于创建名为 stproc_1
且具有一个类型 FLOAT
参数的存储过程:
SELECT GET_DDL('procedure', 'stproc_1(float)'); +---------------------------------------------------+ | GET_DDL('PROCEDURE', 'STPROC_1(FLOAT)') | |---------------------------------------------------| | CREATE OR REPLACE PROCEDURE "STPROC_1"("F" FLOAT) | | RETURNS FLOAT | | LANGUAGE JAVASCRIPT | | EXECUTE AS OWNER | | AS ' | | ''return F;'' | | '; | +---------------------------------------------------+
返回 DDL,用于创建名为 employee_ssn_mask
的掩码策略以对社会安全号码进行掩码。除非用户的当前角色是 PAYROLL,否则会看到已掩码的值。
SELECT GET_DDL('POLICY', 'employee_ssn_mask'); +----------------------------------------------------------------------------+ | GET_DDL('POLICY', 'EMPLOYEE_SSN_MASK') | +----------------------------------------------------------------------------+ | CREATE MASKING POLICY employee_ssn_mask AS (val string) RETURNS string -> | | case | | when current_role() in ('PAYROLL') | | then val | | else '******' | | end; | +----------------------------------------------------------------------------+
返回 DDL,以创建名为 s3_int 的存储集成,该存储集成可创建外部 AWS 暂存区。
SELECT GET_DDL('INTEGRATION', s3_int); +----------------------------------------------------------------------------+ | GET_DDL('INTEGRATION', 's3_int') | |----------------------------------------------------------------------------| | CREATE OR REPLACE STORAGE INTEGRATION s3_int | | TYPE = EXTERNAL_STAGE | | STORAGE_PROVIDER = 'S3' | | STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::001234567890:role/myrole' | | STORAGE_AWS_EXTERNAL_ID='ACCOUNT_SFCRole=2_kztjogs3W9S18I+iWapHpIz/wq4=' | | ENABLED = TRUE | | STORAGE_ALLOWED_LOCATIONS = ('s3://mybucket1/path1/'); | +----------------------------------------------------------------------------+