- Categorias:
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:
Alertas (consulte CREATE ALERT)
Bancos de dados (consulte CREATE DATABASE)
Tabelas dinâmicas (consulte CREATE DYNAMIC TABLE)
Tabelas de eventos (consulte CREATE EVENT TABLE)
Tabelas externas (consulte CREATE EXTERNAL TABLE)
Formatos de arquivo (consulte CREATE FILE FORMAT)
Tabelas Iceberg (consulte CREATE ICEBERG TABLE)
Canal (consulte CREATE PIPE)
Políticas (consulte CREATE AGGREGATION POLICY , CREATE AUTHENTICATION POLICY , CREATE MASKING POLICY , CREATE PASSWORD POLICY , CREATE PROJECTION POLICY , CREATE ROW ACCESS POLICY , CREATE SESSION POLICY)
Esquemas (consulte CREATE SCHEMA)
Sequências (consulte CREATE SEQUENCE)
Procedimentos armazenados (consulte CREATE PROCEDURE)
Fluxos (consulte CREATE STREAM)
Tabelas (consulte CREATE TABLE)
Tags (consulte CREATE TAG)
Tarefas (consulte CREATE TASK)
UDFs incluindo funções externas (consulte CREATE FUNCTION)
Exibições (consulte CREATE VIEW)
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
DYNAMIC_TABLE
EVENT_TABLE
FILE_FORMAT
FUNCTION (para UDFs, incluindo funções externas)
ICEBERG_TABLE
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 (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
ouschema
.
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
eobject_name
(incluindonamespace
se especificado) devem ser colocados entre aspas simples.Para
object_type
,TABLE
eVIEW
são intercambiáveis. Se um tipo de objetoTABLE
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
forFUNCTION
(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 [ , ... ] ] )'
, ondefunction_name
é o nome da função earg_data_type
é o tipo de dados do argumento.Se
object_type
forPROCEDURE
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 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âmetroCOPY 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 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.
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; | ---------------------------------------------------------------------------+