Dependências de objeto

Este tópico fornece conceitos sobre dependências de objeto e informações relacionadas a OBJECT_DEPENDENCIES da exibição Account Usage.

Neste tópico:

O que é uma dependência de objeto?

Uma dependência de objeto significa que, para operar em um objeto, o objeto que está sendo operado deve fazer referência a metadados para si mesmo ou fazer referência a metadados para pelo menos um outro objeto. O Snowflake rastreia as dependências de objeto em OBJECT_DEPENDENCIES da exibição do Account Usage.

O Snowflake oferece suporte a dependências de objetos em sua conta Snowflake local e certas dependências relacionadas ao compartilhamento de dados, tais como a criação de uma exibição na conta do consumidor a partir de uma tabela que é disponibilizada através de um compartilhamento do provedor. As dependências para objetos compartilhados permitem aos responsáveis pelos dados garantir uma maior integridade dos dados, cumprir mais plenamente cada padrão regulatório e gerar uma análise de impacto mais detalhada.

O Snowflake suporta os seguintes tipos de dependência que podem acionar uma dependência: o valor do objeto name, o valor da ID do objeto e a combinação do valor do objeto name com a ID do valor do objeto.

BY_NAME

Uma dependência BY_NAME ocorre quando a instrução SQL especifica o valor name do próprio objeto (por exemplo, um comando CREATE ou ALTER), ou quando um objeto chama o valor name de outro objeto (por exemplo, usando uma cláusula FROM) para completar uma operação SQL.

Por exemplo, considere a seguinte instrução:

create view myview as select * from mytable;
Copy

O valor name da tabela mytable é metadados para a tabela. A exibição chamada myview depende da tabela chamada mytable; a tabela deve existir para criar a exibição.

O Snowflake refere-se à exibição denominada myview como o objeto de referência e à tabela mytable como o objeto referenciado.

BY_ID

Uma dependência BY_ID ocorre quando um objeto armazena a ID do valor de outro objeto. Um exemplo de uma dependência de ID é um estágio externo que armazena o valor OBJECT_ID de uma integração de armazenamento. Atualmente, o valor da ID do objeto de integração de armazenamento só é acessível ao Snowflake e não está visível através de qualquer operação SQL voltada para o cliente.

create stage my_ext_stage
  url='s3://load/files/'
  storage_integration = myint;
Copy

O Snowflake refere-se ao estágio externo denominado my_ext_stage como o objeto de referência e à integração de armazenamento denominada myint como o objeto referenciado.

BY_NAME_AND_ID

Alguns objetos Snowflake (por exemplo, exibições materializadas) dependem tanto do valor do objeto name quanto do valor da ID do objeto. Estes objetos são frequentemente o resultado de uma instrução CREATE OR REPLACE para substituir um objeto existente ou uma instrução ALTER para renomear um objeto.

Para obter mais informações, consulte a seção Notas de uso geral da exibição Account Usage OBJECT_DEPENDENCIES.

Dependências de objeto com suporte

O Snowflake suporta objetos de referência e objetos referenciados da seguinte forma:

Objeto de referência

Objeto referenciado

Tipo de dependência

Exibição, Exibição segura, UDF SQL, UDTF SQL e outros objetos referenciados pelo nome

Exibição

Exibição segura

Exibição materializada

UDF (todos os tipos)

UDTF

e outros objetos referenciados pelo nome

BY_NAME

Estágio externo

Fluxo

Integração de armazenamento

Tabela, Exibição, Exibição segura

BY_ID

Tabela externa

Estágio

BY_ID

Exibição materializada

Tabela, Tabela externa

BY_NAME_AND_ID

Observe que Snowflake oferece suporte apenas aos seguintes objetos no contexto do compartilhamento de dados:

Objeto de referência

Objeto referenciado

Tipo de dependência

Exibição, UDF SQL, UDTF SQL

Tabela

Exibição segura

Exibição materializada segura

UDF Seguro e UDTF seguro

BY_NAME

Exibição materializada

Tabela

BY_NAME_AND_ID

Para obter mais detalhes, consulte a seção Usage Notes da exibição OBJECT_DEPENDENCIES.

Benefícios

A identificação de dependências de objeto pode fornecer informações sobre casos de uso de rastreamento de dados da seguinte forma:

Análise de impacto

O conhecimento da dependência de objetos permite aos administradores de dados identificar as relações entre objetos de referência e objetos referenciados para garantir que as atualizações dos objetos referenciados não tenham impacto adverso sobre os usuários do objeto de referência.

Por exemplo, um proprietário de tabela planeja adicionar uma coluna a uma tabela. Consultar a exibição OBJECT_DEPENDENCIES com base no nome da tabela retorna todos os objetos (por exemplo, exibições) que serão afetados.

O administrador de dados pode então coordenar um plano de ação para assegurar que o tempo de atualização de tabelas e visualizações não resulte em nenhuma consulta quebrada que afete negativamente os usuários que consultam as exibições criadas a partir da tabela.

Conformidade

A relação de dependência de objetos ajuda o responsável pela conformidade a identificar a relação entre fontes de dados confidenciais (ou seja, objeto referenciado) e destinos de dados (ou seja, objeto de referência). O responsável pela conformidade pode então decidir como melhor atualizar o objeto de referência e o objeto referenciado com base nos requisitos de conformidade (por exemplo, GDPR).

Integridade de dados

A relação de dependência de objetos ajuda os profissionais de dados primários, tais como analistas, cientistas, encarregados de conformidade e outros usuários comerciais, a ter confiança de que os dados provêm de uma fonte confiável.

Limitações

Além da exibição Usage Notes, observe as seguintes limitações ao consultar a exibição OBJECT_DEPENDENCIES:

Parâmetros de sessão

O Snowflake não pode calcular com precisão as dependências dos objetos que incluem parâmetros de sessão em suas definições porque os parâmetros de sessão podem assumir valores diferentes, dependendo do contexto.

O Snowflake recomenda não utilizar variáveis de sessão em definições de exibição e função.

Implementações do Snowflake

Esta exibição não capta as dependências que são necessárias para as implementações do Snowflake. Por exemplo, a exibição não registra a dependência necessária para criar uma nova tabela a partir do clone de outra tabela.

Resolução de objetos

Se uma definição de exibição usa uma função para chamar um objeto para criar a exibição, ou se um objeto é chamado dentro de outra função ou exibição, o Snowflake não registra uma dependência de objeto. Por exemplo:

create or replace view v_on_stage_function
as
select *
from T1
where get_presigned_url(@stage1, 'data_0.csv.gz')
is not null;
Copy

Neste exemplo, a função get_presigned_url chama o estágio stage1. O Snowflake não registra que a exibição chamada v_on_stage_function depende do estágio chamado stage1.

Dependências quebradas

Se o valor do tipo de dependência for BY_NAME_AND_ID e uma dependência de objeto mudar devido a uma operação CREATE OR REPLACE ou ALTER em um objeto, o Snowflake registra apenas a dependência de objeto antes destas operações.

O Snowflake não registra a dependência de objetos no resultado da consulta de exibição após estas operações, porque o resultado é uma referência quebrada.

Dependências de objetos com recursos e serviços de floco de neve

Objetos externos

O Snowflake rastreia dependências de objetos apenas para objetos Snowflake. Por exemplo, se um objeto Snowflake depende de um bucket Amazon S3, esta exibição não registra a dependência do bucket porque ele é um objeto Amazon, não um objeto Snowflake.

Replicação

Enquanto um objeto secundário depende do objeto primário, esta exibição não registra dependências devidas a uma operação de replicação.

Compartilhamento de dados

Para contas de provedor, esta exibição não permite que uma conta de provedor de compartilhamento de dados determine objetos dependentes na conta de consumidor de compartilhamento de dados. Por exemplo, um provedor de compartilhamento de dados cria uma exibição e a compartilha. O provedor do compartilhamento de dados não pode usar esta exibição para determinar qualquer objeto na conta do consumidor que foi criado a partir da exibição compartilhada (por exemplo, novas tabelas ou exibições).

Para contas de consumidor, esta exibição não permite que uma conta de consumidor de compartilhamento de dados determine objetos dependentes na conta de provedor de compartilhamento de dados. Por exemplo, se uma conta de consumidor de compartilhamento de dados usar um UDF disponibilizado pela conta do provedor de compartilhamento de dados, o consumidor do compartilhamento de dados não pode utilizar esta exibição para identificar quaisquer objetos dos quais o UDF compartilhado depende.

Para obter mais detalhes, consulte Notas de uso do compartilhamento de dados.

Consulta da exibição OBJECT_DEPENDENCIES

Os exemplos a seguir cobrem estes casos de uso:

  1. Mostrar objetos dependentes de uma tabela externa.

  2. Análise de impacto: encontrar os objetos referenciados por uma tabela.

  3. GDPR: encontrar a fonte de dados para uma determinada exibição.

  4. Compartilhamento de dados.

Mostrar objetos dependentes de uma tabela externa

Crie uma exibição materializada chamada sales_view a partir da tabela externa chamada sales_staging_table:

CREATE OR REPLACE MATERIALIZED VIEW sales_view AS SELECT * FROM sales_staging_table;
Copy

Consulte a exibição OBJECT_DEPENDENCIES no esquema Account Usage do banco de dados compartilhado SNOWFLAKE. Observe que a exibição materializada é referencing_object_name e a tabela externa é referenced_object_domain:

SELECT referencing_object_name, referencing_object_domain, referenced_object_name, referenced_object_domain
FROM snowflake.account_usage.object_dependencies
WHERE referenced_object_name = 'SALES_STAGING_TABLE' and referenced_object_domain = 'EXTERNAL TABLE';
Copy
+-------------------------+---------------------------+------------------------+--------------------------+
| REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN |
+-------------------------+---------------------------+------------------------+--------------------------+
| SALES_VIEW              | MATERIALIZED VIEW         | SALES_STAGING_TABLE    | EXTERNAL TABLE           |
+-------------------------+---------------------------+------------------------+--------------------------+

Análise de impacto: encontrar os objetos referenciados por uma tabela

Considere uma tabela base chamada SALES_NA, onde NA indica a América do Norte, US indica os Estados Unidos e CAL indica a Califórnia, com uma série de exibições aninhadas:

  • (tabela) SALES_NA » (exibição) NORTH_AMERICA_SALES » (exibição) US_SALES

  • (tabela) SALES_NA » (exibição) NORTH_AMERICA_SALES » (exibição) CAL_SALES

Para criar a tabela e as exibições aninhadas, execute os seguintes comandos:

CREATE TABLE sales_na(product string);
CREATE OR REPLACE VIEW north_america_sales AS SELECT * FROM sales_na;
CREATE VIEW us_sales AS SELECT * FROM north_america_sales;
CREATE VIEW cal_sales AS SELECT * FROM north_america_sales;
Copy

Da mesma forma, considere a relação da tabela base SALES_NA com suas exibições aninhadas, e considere a tabela base SALES_UK, onde UK indica o Reino Unido, com sua exibição aninhada.

Observe que duas exibições diferentes servem como objetos de origem para derivar a exibição chamada GLOBAL_SALES:

  • (tabela) SALES_NA » (exibição) NORTH_AMERICA_SALES » (exibição) GLOBAL_SALES

  • (tabela) SALES_UK » (exibição) GLOBAL_SALES

Para criar estas exibições aninhadas, execute os seguintes comandos:

CREATE TABLE sales_uk (product string);
CREATE VIEW global_sales AS SELECT * FROM sales_uk UNION ALL SELECT * FROM north_america_sales;
Copy

Consulte a exibição OBJECT_DEPENDENCIES no esquema Account Usage do banco de dados compartilhado SNOWFLAKE para determinar as referências de objetos para a tabela SALES_NA. Observe a quarta linha no resultado da consulta, que especifica a tabela SALES_NA mas não faz referência à tabela SALES_UK:

WITH RECURSIVE referenced_cte
(object_name_path, referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id)
    AS
      (
        SELECT referenced_object_name || '-->' || referencing_object_name as object_name_path,
               referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing
          WHERE true
            AND referenced_object_name = 'SALES_NA' AND referenced_object_domain='TABLE'

        UNION ALL

        SELECT object_name_path || '-->' || referencing.referencing_object_name,
              referencing.referenced_object_name, referencing.referenced_object_domain, referencing.referencing_object_domain, referencing.referencing_object_name,
              referencing.referenced_object_id, referencing.referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing JOIN referenced_cte
            ON referencing.referenced_object_id = referenced_cte.referencing_object_id
            AND referencing.referenced_object_domain = referenced_cte.referencing_object_domain
      )

  SELECT object_name_path, referenced_object_name, referenced_object_domain, referencing_object_name, referencing_object_domain
    FROM referenced_cte
;
Copy
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+
| OBJECT_NAME_PATH                              | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN | REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN |
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+
| SALES_NA-->NORTH_AMERICA_SALES                | SALES_NA               | TABLE                    | NORTH_AMERICA_SALES     | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->CAL_SALES    | NORTH_AMERICA_SALES    | VIEW                     | CAL_SALES               | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->US_SALES     | NORTH_AMERICA_SALES    | VIEW                     | US_SALES                | VIEW                      |
| SALES_NA-->NORTH_AMERICA_SALES-->GLOBAL_SALES | NORTH_AMERICA_SALES    | VIEW                     | GLOBAL_SALES            | VIEW                      |
+-----------------------------------------------+------------------------+--------------------------+-------------------------+---------------------------+

GDPR: encontrar a fonte de dados para uma determinada exibição

Objetos derivados (por exemplo, exibições, CTAS) podem ser criados a partir de muitos objetos de origem diferentes para fornecer uma exibição ou painel de controle personalizado. Para atender aos requisitos regulamentares, tais como GDPR, os encarregados de conformidade e auditores precisam ser capazes de rastrear dados de um determinado objeto até sua origem.

Por exemplo, a exibição GLOBAL_SALES é derivada de dois caminhos de dependência diferentes que apontam para duas tabelas base diferentes:

  • (tabela) SALES_NA » (exibição) NORTH_AMERICA_SALES » (exibição) GLOBAL_SALES

  • (tabela) SALES_UK » (exibição) GLOBAL_SALES

Para criar estas exibições aninhadas, execute os seguintes comandos:

CREATE TABLE sales_na (product string);
CREATE OR REPLACE VIEW north_america_sales AS SELECT * FROM sales_na;
CREATE TABLE sales_uk (product string);
CREATE VIEW global_sales AS SELECT * FROM sales_uk UNION ALL SELECT * FROM north_america_sales;
Copy

Consulte a exibição OBJECT_DEPENDENCIES no esquema Account Usage do banco de dados compartilhado SNOWFLAKE para encontrar a(s) fonte(s) de dados da exibição GLOBAL_SALES. Cada linha no resultado da consulta especifica um caminho de dependência para um objeto único.

WITH RECURSIVE referenced_cte
(object_name_path, referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id)
    AS
      (
        SELECT referenced_object_name || '<--' || referencing_object_name AS object_name_path,
               referenced_object_name, referenced_object_domain, referencing_object_domain, referencing_object_name, referenced_object_id, referencing_object_id
          from snowflake.account_usage.object_dependencies referencing
          WHERE true
            AND referencing_object_name = 'GLOBAL_SALES' and referencing_object_domain='VIEW'

        UNION ALL

        SELECT referencing.referenced_object_name || '<--' || object_name_path,
              referencing.referenced_object_name, referencing.referenced_object_domain, referencing.referencing_object_domain, referencing.referencing_object_name,
              referencing.referenced_object_id, referencing.referencing_object_id
          FROM snowflake.account_usage.object_dependencies referencing JOIN referenced_cte
            ON referencing.referencing_object_id = referenced_cte.referenced_object_id
            AND referencing.referencing_object_domain = referenced_cte.referenced_object_domain
      )

  SELECT object_name_path, referencing_object_name, referencing_object_domain, referenced_object_name, referenced_object_domain
    FROM referenced_cte
;
Copy
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+
| OBJECT_NAME_PATH                              | REFERENCING_OBJECT_NAME | REFERENCING_OBJECT_DOMAIN | REFERENCED_OBJECT_NAME | REFERENCED_OBJECT_DOMAIN |
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+
| SALES_UK<--GLOBAL_SALES                       | GLOBAL_SALES            | VIEW                      | SALES_UK               | TABLE                    |
| NORTH_AMERICA_SALES<--GLOBAL_SALES            | GLOBAL_SALES            | VIEW                      | NORTH_AMERICA_SALES    | VIEW                     |
| SALES_NA<--NORTH_AMERICA_SALES<--GLOBAL_SALES | NORTH_AMERICA_SALES     | VIEW                      | SALES_NA               | TABLE                    |
+-----------------------------------------------+-------------------------+---------------------------+------------------------+--------------------------+

Compartilhamento de dados

Considere a tabela a seguir, que é um trecho da exibição OBJECT_DEPENDENCIES na conta do consumidor, em que:

  • V1 especifica uma exibição que o consumidor cria a partir de um objeto compartilhado.

  • S_V1 especifica uma exibição que o provedor compartilha.

  • S_T1 especifica uma tabela que o provedor compartilha.

Linha

REFERENCING_OBJECT_NAME

REFERENCED_OBJECT_NAME

REFERENCED_OBJECT_DOMAIN

REFERENCED_OBJECT_ID

1

V1

S_V1

TABLE

NULL

2

V1

S_T1

TABLE

NULL

Dada esta tabela, observe o seguinte:

  • Se o provedor revogar S_T1 do compartilhamento, o consumidor continuará a ver linhas que especificam S_T1 (linha 2) em sua exibição local, desde que S_T1 não tenha sido renomeado antes da revogação.

  • Se o provedor descartar uma tabela ou exibição em sua conta, a tabela ou exibição não será mais incluída no compartilhamento. A exibição do consumidor local preserva os registros existentes para a tabela ou exibição descartada porque a tabela ou exibição foi compartilhada antes da operação de descarte na conta do provedor.

    O consumidor não pode observar mudanças de exibição na conta do provedor.