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 suportados 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> ] )

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

  • FILE_FORMAT

  • FUNCTION (para UDFs, incluindo funções externas)

  • PIPE

  • POLICY (políticas de mascaramento e acesso a linhas)

  • PROCEDURE (para procedimentos armazenados)

  • SCHEMA

  • SEQUENCE

  • STREAM

  • TABLE (inclusive para tabelas externas)

  • TAG (marcação de objetos)

  • TASK

  • VIEW (inclusive para exibições materializadas)

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 (VARCHAR) contendo 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, se a instrução original CREATE PROCEDURE não especificou EXECUTE AS OWNER ou EXECUTE AS CALLER, a saída de GET_DDL inclui EXECUTE AS OWNER porque esse é 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 [ , ... ] ] )'.

  • 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 visualizar os 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 de exibição (isto é, 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;
      

As seguintes notas se aplicam especificamente a objetos de tabela e exibição com uma tag, política de mascaramento ou política de acesso a linhas:

  • A função que executa a consulta GET_DDL deve ter o privilégio global APPLY MASKING POLICY, APPLY ROW ACCESS POLICY ou APPLY TAG e o privilégio USAGE no banco de dados e esquema que contém 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.

Detalhes do agrupamento

  • Collation information is included in the input.

Exemplos

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

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

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

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.

Retornar o DDL usado para criar um UDF chamado multiply que tem dois parâmetros do tipo 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';                                      |
--------------------------------------------------+

Retornar o DDL para criar um procedimento armazenado chamado stproc_1 que tenha um parâmetro do tipo 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;''                                     |
| ';                                                |
+---------------------------------------------------+

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