Categorias:

Funções de metadados

GET_DDL

Retorna uma instrução DDL que pode ser usada para recriar o objeto especificado. Para bancos de dados e esquemas, GET_DDL é recursivo (ou seja, retorna as instruções DDL para recriar todos os objetos compatíveis dentro do banco de dados/esquema especificado).

GET_DDL oferece suporte atualmente aos seguintes tipos de objetos:

Sintaxe

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

Argumentos

Obrigatório:

'object_type'

Especifica o tipo de objeto para o qual o DDL é devolvido. Os valores válidos (correspondentes aos tipos de objetos suportados) são:

  • CONTACT

  • DATABASE

  • DYNAMIC_TABLE

  • EVENT_TABLE

  • FILE_FORMAT

  • FUNCTION (para UDFs, incluindo funções de métricas de dados e funções externas)

  • ICEBERG_TABLE

  • INTEGRATION (armazenamento)

  • PIPE

  • POLICY (aggregation, authentication, join, masking, password, projection, row access, session, and storage lifecycle policies)

  • PROCEDURE (para procedimentos armazenados)

  • SCHEMA

  • SEMANTIC VIEW

  • SEQUENCE

  • STREAM

  • TABLE (para tabelas, tabelas externas e tabelas híbridas)

  • TAG (marcação de objetos)

  • TASK

  • VIEW (para exibições e exibições materializadas)

  • WAREHOUSE

'namespace.object_name'

Especifica o nome totalmente qualificado do objeto para o qual o DDL é devolvido.

Namespace é o banco de dados e/ou esquema no qual o objeto reside:

  • Não utilizado para bancos de dados.

  • Para esquemas, toma a forma de database.

  • Para objetos de esquema (tabelas, exibições, fluxos, tarefas, sequências, formatos de arquivo, canais, políticas e UDFs), toma a forma de database.schema ou schema.

O namespace é opcional se um banco de dados e esquema estiverem em uso atualmente dentro da sessão do usuário; caso contrário, ele é obrigatório.

Opcional:

use_fully_qualified_names_for_recreated_objects

If TRUE, the generated DDL statements use fully qualified names for the objects to be recreated.

Padrão: FALSE.

Nota

Isto não afeta os nomes de outros objetos referenciados na instrução DDL (por exemplo, o nome de uma tabela referenciada em uma definição de exibição).

Retornos

Retorna uma cadeia de caracteres (um valor VARCHAR) com o texto da instrução DDL que criou o objeto.

Para UDFs e procedimentos armazenados, a saída pode ser um pouco diferente do DDL original. Por exemplo, se o UDF ou procedimento armazenado tiver um código JavaScript, os caracteres delimitadores ao redor do código JavaScript poderão ser diferentes.

Além disso, observe que a instrução DDL retornada pela função pode incluir valores padrão para propriedades. Por exemplo, mesmo que a instrução CREATE PROCEDURE original não tenha especificado EXECUTE AS OWNER, a instrução DDL retornada pela função inclui EXECUTE AS OWNER, que é o padrão.

Requisitos de controle de acesso

Notas de uso

As seguintes notas se aplicam a todos os objetos suportados:

  • object_type e object_name (incluindo namespace se especificado) devem ser colocados entre aspas simples.

  • Para object_type, TABLE e VIEW são intercambiáveis. Se um tipo de objeto TABLE for especificado, e o objeto especificado pelo nome for uma exibição, a função retorna o DDL para a exibição e vice-versa.

  • Se object_type for FUNCTION (isto é, UDF) e o UDF tiver argumentos, você deve incluir os tipos de dados do argumento como parte do nome da função, na forma de 'function_name( [ arg_data_type [ , ... ] ] )', onde function_name é o nome da função e arg_data_type é o tipo de dados do argumento.

  • Se object_type for PROCEDURE e o procedimento armazenado tiver argumentos, então você deve incluir os tipos de dados dos argumentos como parte do nome da função, na forma de 'procedure_name( [ arg_data_type [ , ... ] ] )'.

  • A consulta desta função para a maioria dos tipos de objetos Snowflake requer as mesmas permissões mínimas necessárias para visualizar o objeto (usando DESCRIBE <objeto> ou SHOW <objetos>). O Snowflake restringe a exibição de objetos especiais, como exibições seguras, ao proprietário, que é a função com o privilégio OWNERSHIP no objeto.

  • Quando o retornava DDL incluir especificações de tipos de dados, essa função substitui os aliases de tipos de dados na instrução original por nomes de tipos de dados padrão do Snowflake por padrão. Se você quiser que o seja retornado DDL Para incluir os aliases de tipo de dados na instrução original, defina o ENABLE_GET_DDL_USE_DATA_TYPE_ALIAS Parâmetro para TRUE.

Para tabelas Iceberg:

  • Se você especificar um objeto TABLE que seja uma tabela Iceberg, a função retornará o DDL para a tabela Iceberg.

  • Se BASE_LOCATION tiver sido especificado na instrução original CREATE ICEBERG TABLE, a função retornará a entrada original do usuário. Caso contrário, a função retorna o caminho do arquivo construído pelo Snowflake (incluindo a cadeia de caracteres aleatória de 8 caracteres). Para obter mais informações, consulte Diretórios de dados e metadados.

Para banco de dados vinculado a catálogo:

  • A saída inclui as opções de LINKED_CATALOG.

  • Para ALLOWED_NAMESPACES e BLOCKED_NAMESPACES, o Snowflake não armazena namespaces aninhados se o conjunto já contiver o namespace pai. Por exemplo, se você criar um banco de dados e especificar ALLOWED_NAMESPACES = ('ns1', 'ns1.ns2', 'ns1.ns3'), o Snowflake retorna ALLOWED_NAMESPACES = ('ns1') na saída GET_DDL. O mesmo se aplica a BLOCKED_NAMESPACES.

As seguintes notas são específicas para exibir objetos. O resultado da consulta sempre:

  • Retorna o texto SQL em minúsculas para create or replace view, mesmo que o uso de maiúsculas e minúsculas na instrução SQL original usada para criar a exibição fosse em maiúsculas ou em maiúsculas e minúsculas.

  • Inclui a cláusula OR REPLACE.

  • Inclui a propriedade SECURE, se a exibição for segura.

  • Exclui o parâmetro de exibição COPY GRANTS, mesmo que a instrução CREATE VIEW original especifique o parâmetro COPY GRANTS.

  • Gera a lista de colunas.

    Se uma política de mascaramento for definida em uma coluna, o resultado especifica a política de mascaramento da coluna.

  • Remove comentários SQL em linha antes do corpo da exibição (ou seja, antes de AS). Por exemplo, no código seguinte, o comentário imediatamente anterior à cláusula AS é removido:

    CREATE VIEW view_t1
      -- GET_DDL() removes this comment.
      AS SELECT * FROM t1;
    
    Copy

As notas a seguir se aplicam especificamente a objetos de tabela e exibição com uma tag ou política:

  • The role executing the GET_DDL query must have the global APPLY MASKING POLICY, APPLY ROW ACCESS POLICY, APPLY AGGREGATION POLICY, APPLY JOIN POLICY, APPLY PROJECTION POLICY, APPLY STORAGE LIFECYCLE POLICY, or APPLY TAG privilege and the USAGE privilege on the database and schema containing the policy or tag. Otherwise, Snowflake replaces the policy with #UNKNOWN_POLICY and the tag with #UNKNOWN_TAG='#UNKNOWN_VALUE. This text indicates that the column or the object is protected by a policy and a tag is set on the object or column. If this text is not removed prior to recreating the object, the CREATE OR REPLACE <object> statement fails.

    Se este texto estiver presente no resultado da consulta GET_DDL, antes de recriar o objeto, consulte seu administrador de governança interna para determinar quais políticas e tags são necessárias para as colunas ou objeto. Por fim, edite o resultado da consulta GET_DDL e depois recrie o objeto.

    Sem os privilégios mencionados, esta função de tabela não retorna a linha correspondente para as atribuições de política e tag na saída da chamada da função.

  • Quando múltiplas tags são definidas no objeto ou coluna, a saída GET_DDL ordena as tags alfabeticamente pelo nome da tag.

  • O descarte de uma tag remove a tag da saída GET_DDL.

  • Se uma tag for definida na tabela ou na exibição, a saída GET_DDL para a tabela ou exibição incluirá as atribuições da tag na instrução CREATE OR REPLACE.

  • If a masking policy, row access policy, or storage lifecycle policy is set, the GET_DDL output includes the policy assignments using the WITH keyword.

Quando uma tag é definida no banco de dados ou no esquema, a saída GET_DDL inclui:

  • Uma instrução ALTER DATABASE quando a tag é definida no banco de dados.

  • Uma instrução ALTER DATABASE e uma instrução ALTER SCHEMA quando a tag é definida tanto no banco de dados quanto no esquema.

  • Uma instrução ALTER SCHEMA quando a tag é definida no esquema.

  • Uma instrução CREATE OR REPLACE para gerar a tag, se a tag existir no banco de dados ou esquema.

O seguinte se aplica às integrações de armazenamento:

  • O comando sempre retorna a sintaxe CREATE OR REPLACE STORAGE INTEGRATION.

  • Se um STORAGE_AWS_EXTERNAL_ID não foi especificado durante a criação da integração de armazenamento, este comando retorna o ID que foi gerado automaticamente durante a criação da integração de armazenamento.

Detalhes do agrupamento

  • Collation information is included in the input.

Exemplos

Os exemplos a seguir demonstram como usar essa função para recuperar a instrução DDL de um objeto:

Exibições

Retornar o DDL usado para criar uma exibição chamada 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

Exibições semânticas

Consulte Obtenção da instrução SQL para uma exibição semântica.

Esquemas

Retornar o DDL usado para criar um esquema chamado books_schema e os objetos no esquema (a tabela books_table e a exibição 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

Retornar o DDL que usa nomes totalmente qualificados para os objetos a serem recriados:

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

Nota

Como demonstrado no exemplo acima, a instrução DDL não usa um nome totalmente qualificado para a tabela usada para criar a exibição. Para resolver o nome desta tabela, Snowflake usa o nome do banco de dados e o nome do esquema para a exibição.

UDFs e procedimentos armazenados

Retorna o DDL usado para criar uma UDF nomeada multiply que tem dois argumentos com o tipo de dados NUMBER:

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

Retorne o DDL para criar um procedimento armazenado nomeado stproc_1 que tenha um argumento com o tipo de dados 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

Políticas de mascaramento

Retornar o DDL para criar uma política de mascaramento chamada employee_ssn_mask para mascarar os números da previdência social. Os valores mascarados são vistos a menos que a função atual do usuário seja 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

Integrações de armazenamento

Retorne DDL para criar uma integração de armazenamento nomeada s3_int que cria um estágio AWS externo.

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

Warehouses

Suponha que você execute a seguinte instrução para criar um warehouse nomeado my_wh:

CREATE OR REPLACE WAREHOUSE my_wh
  WAREHOUSE_SIZE=LARGE
  INITIALLY_SUSPENDED=TRUE;
Copy

A seguinte chamada para a função GET_DDL retorna a instrução DDL para recriar este warehouse:

SELECT GET_DDL('WAREHOUSE', 'my_wh');
Copy
+-------------------------------------------+
| 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   |
| ;                                         |
+-------------------------------------------+

Observe que a instrução retornada pela função GET_DDL inclui valores padrão para as propriedades não especificadas na instrução CREATE WAREHOUSE. Por exemplo, a instrução CREATE WAREHOUSE não especificou a propriedade AUTO_RESUME, então a instrução retornada inclui AUTO_RESUME=TRUE, que é o valor padrão para esta propriedade.

Tabelas híbridas

O exemplo a seguir mostra o DDL que é retornado para uma tabela híbrida nomeada ht_weather, que tem uma restrição PRIMARY KEY na coluna id.

CREATE OR REPLACE HYBRID TABLE ht_weather
 (id INT PRIMARY KEY,
  start_time TIMESTAMP,
  precip NUMBER(3,2),
  city VARCHAR(20),
  county VARCHAR(20));
Copy

Observe que o primeiro argumento da função usa o tipo TABLE para tabelas híbridas.

SELECT GET_DDL('TABLE','ht_weather');
Copy

A restrição PRIMARY KEY assume uma posição fora de linha na saída, após as definições de coluna. Consulte também Restrições em 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)                          |
| );                                          |
+---------------------------------------------+