类别:

元数据函数

GET_DDL

返回可用于重新创建指定对象的 DDL 语句。对于数据库和模式,GET_DDL 是递归的(即,它返回 DDL 语句,用于在指定数据库/架构中重新创建所有支持对象)。

GET_DDL 目前支持以下对象类型:

语法

GET_DDL( '<object_type>' , '[<namespace>.]<object_name>' [ , <use_fully_qualified_names_for_recreated_objects> ] )
Copy

实参

必填:

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.schemaschema 的形式。

如果数据库和架构当前正在用户会话中使用,则命名空间为 可选;否则,为必需。

可选:

use_fully_qualified_names_for_recreated_objects

如果为 TRUE,则生成的 DDL 语句为要重新创建的对象使用完全限定名称。

默认:FALSE

备注

此参数不影响 DDL 语句中引用的其他对象的名称(例如,视图定义中引用的表的名称)。

返回

返回字符串 (VARCHAR),其中包含用于创建对象的 DDL 语句的文本。

对于 UDFs 和存储过程,输出可能与原始 DDL 略有不同。例如,如果 UDF 或存储过程包含 JavaScript 代码,则 JavaScript 代码周围的分隔符字符可能不同。此外,如果原始 CREATE PROCEDURE 语句未指定 EXECUTE AS OWNEREXECUTE AS CALLER,则 GET_DDL 的输出包含 EXECUTE AS OWNER,因为这是默认值。

使用说明

以下说明适用于所有支持对象:

  • object_typeobject_name (包括 namespace,如果已指定)必须放在单引号内。

  • 对于 object_typeTABLEVIEW 可互换。如果指定 TABLE 对象类型,并且按名称指定的对象是视图,则函数返回视图的 DDL,反之亦然。

  • 如果 object_typeFUNCTION (即 UDF)并且 UDF 包含实参,您必须将实参数据类型作为函数名称的一部分包含在内,形式为 'function_name( [ arg_data_type [ , ... ] ] )',其中 function_name 是函数的名称,arg_data_type 是实参的数据类型。

  • 如果 object_typePROCEDURE,并且存储过程包含实参,您必须将实参数据类型作为函数名称的一部分包含在内,形式为 '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;
      
      Copy

以下说明特别适用于带有标签或策略的表和视图对象:

  • 执行 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; |
|                                                                             |
+-----------------------------------------------------------------------------+
Copy

返回 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; |
|                                                                             |
+-----------------------------------------------------------------------------+
Copy

返回 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; |
|                                                                                                   |
+---------------------------------------------------------------------------------------------------+
Copy

备注

如上面的示例所示,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';                                      |
+--------------------------------------------------+
Copy

返回 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;''                                     |
| ';                                                |
+---------------------------------------------------+
Copy

返回 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;                                                                       |
+----------------------------------------------------------------------------+
Copy

返回 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/');                   |
+----------------------------------------------------------------------------+
Copy
语言: 中文