- 类别:
GET_DDL¶
返回可用于重新创建指定对象的 DDL 语句。对于数据库和模式,GET_DDL 是递归的(即,它返回 DDL 语句,用于在指定数据库/架构中重新创建所有支持对象)。
GET_DDL 目前支持以下对象类型:
警告(请参阅 CREATE ALERT)
数据库(请参阅 CREATE DATABASE)
数据指标函数(请参阅 CREATE DATA METRIC FUNCTION)
动态表(请参阅 CREATE DYNAMIC TABLE)
事件表(请参阅 CREATE EVENT TABLE)
外部表(请参阅 CREATE EXTERNAL TABLE)
文件格式(请参阅 CREATE FILE FORMAT)
混合表(请参阅 CREATE HYBRID TABLE)
Apache Iceberg™ 表(请参阅 CREATE ICEBERG TABLE)
管道(请参阅 CREATE PIPE)
策略(请参阅 CREATE AGGREGATION POLICY、CREATE AUTHENTICATION POLICY、CREATE JOIN POLICY、CREATE MASKING POLICY、CREATE PASSWORD POLICY、CREATE PRIVACY 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)
仓库(请参阅 CREATE WAREHOUSE)
语法¶
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(适用于视图和物化视图)
WAREHOUSE
'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 代码周围的分隔符字符可能不同。
此外,请注意,函数返回的 DDL 语句可能包含属性的默认值。例如,即使原始 CREATE PROCEDURE 语句未指定 EXECUTE AS OWNER,函数返回的 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 JOIN 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 使用数据库的名称和视图的架构名称。
UDFs 和存储过程¶
返回 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/'); |
+----------------------------------------------------------------------------+
仓库¶
假设您执行以下语句来创建名为 my_wh
的仓库:
CREATE OR REPLACE WAREHOUSE my_wh
WAREHOUSE_SIZE=LARGE
INITIALLY_SUSPENDED=TRUE;
以下对 GET_DDL 函数的调用返回了重新创建此仓库的 DDL 语句:
SELECT GET_DDL('WAREHOUSE', 'my_wh');
+-------------------------------------------+
| GET_DDL('WAREHOUSE', 'MY_WH') |
|-------------------------------------------|
| create or replace warehouse MY_WH |
| with |
| warehouse_type='STANDARD' |
| warehouse_size='Large' |
| max_cluster_count=1 |
| min_cluster_count=1 |
| scaling_policy=STANDARD |
| auto_suspend=600 |
| auto_resume=TRUE |
| initially_suspended=TRUE |
| enable_query_acceleration=FALSE |
| query_acceleration_max_scale_factor=8 |
| max_concurrency_level=8 |
| statement_queued_timeout_in_seconds=0 |
| statement_timeout_in_seconds=172800 |
| ; |
+-------------------------------------------+
请注意,GET_DDL 函数返回的语句包含 CREATE WAREHOUSE 语句中未指定的属性的默认值。例如,CREATE WAREHOUSE 语句未指定 AUTO_RESUME 属性,因此返回的语句包括 AUTO_RESUME =TRUE,这是该属性的默认值。
混合表¶
以下示例显示了名为 ht_weather
的混合表返回的 DDL,对 id
列有 PRIMARY KEY 约束。
CREATE OR REPLACE HYBRID TABLE ht_weather
(id INT PRIMARY KEY,
start_time TIMESTAMP,
precip NUMBER(3,2),
city VARCHAR(20),
county VARCHAR(20));
请注意,函数的第一个实参使用混合表的 TABLE
类型。
SELECT GET_DDL('TABLE','ht_weather');
PRIMARY KEY 约束条件在输出中处于列定义之后的离线位置。另请参阅 GET_DDL 约束。
+---------------------------------------------+
| GET_DDL('TABLE','HT_WEATHER') |
|---------------------------------------------|
| create or replace HYBRID TABLE HT_WEATHER ( |
| ID NUMBER(38,0) NOT NULL, |
| START_TIME TIMESTAMP_NTZ(9), |
| PRECIP NUMBER(3,2), |
| CITY VARCHAR(20), |
| COUNTY VARCHAR(20), |
| primary key (ID) |
| ); |
+---------------------------------------------+