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:

  • 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 (políticas de agregação, autenticação, mascaramento, senha, projeção, acesso a linhas e de sessão)

  • PROCEDURE (para procedimentos armazenados)

  • SCHEMA

  • 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

Se TRUE, as instruções DDL geradas utilizam nomes totalmente qualificados para os objetos a serem recriados.

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.

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 [ , ... ] ] )'.

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

  • 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 (ou seja, a função com o privilégio OWNERSHIP no objeto).

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:

  • A função que executa a consulta GET_DDL deve ter o privilégio global APPLY MASKING POLICY, APPLY ROW ACCESS POLICY, APPLY AGGREGATION POLICY ou APPLY PROJECTION POLICY ou APPLY TAG e o privilégio USAGE no banco de dados e esquema contendo a política ou tag. Caso contrário, o Snowflake substitui a política por #UNKNOWN_POLICY e a tag por #UNKNOWN_TAG='#UNKNOWN_VALUE. Este texto indica que a coluna ou o objeto é protegido por uma política e uma tag é definida no objeto ou coluna. Se este texto não for removido antes da recriação do objeto, a instrução CREATE OR REPLACE <objeto> falha.

    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.

  • Se uma política de mascaramento for definida na coluna ou uma política de acesso a linhas for definida na tabela, a saída GET_DDL incluirá as atribuições da política usando a palavra-chave WITH.

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

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

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)                          |
| );                                          |
+---------------------------------------------+