Adição de conteúdo de dados compartilhados a um pacote de aplicativo

Este tópico descreve como adicionar conteúdo de dados compartilhados a um pacote de aplicativo.

Sobre o compartilhamento de conteúdo de dados em um pacote de aplicativo

O Snowflake Native App Framework permite adicionar conteúdo de dados compartilhados a um pacote de aplicativo. Este conteúdo de dados é compartilhado com os consumidores que usam seu Snowflake Native App. O conteúdo de dados que você compartilha em um pacote de aplicativo é compartilhado em todas as instâncias instaladas do Snowflake Native App.

O conteúdo de dados compartilhados não tem versão, o que significa que todas as versões de seu Snowflake Native App usam os mesmos dados. Isso é diferente da lógica do aplicativo, que tem versão.

Um consumidor não pode acessar o conteúdo compartilhado diretamente. Em vez disso, um provedor cria uma exibição segura no script de configuração de um pacote de aplicativo e concede ao consumidor acesso à exibição segura. Para obter mais detalhes, consulte Exposição dos objetos compartilhados aos consumidores.

Objetos de banco de dados que podem ser compartilhados com um pacote de aplicativo

O Snowflake Native App Framework permite que os provedores adicionem os seguintes objetos de banco de dados a um pacote de aplicativo:

  • Esquemas

  • Tabelas

  • Exibições

Nota

Ao compartilhar objetos de banco de dados, como tabelas e exibições, você também deve compartilhar o esquema que os contém.

As seguintes restrições se aplicam a tabelas e exibições compartilhadas em um pacote de aplicativo:

  • As tabelas não podem ter colunas virtuais, incluindo políticas, contendo código Java, Python ou JavaScript.

  • As definições de exibição ou colunas virtuais associadas a elas, como políticas, não podem conter chamadas para Java, Python ou JavaScript

  • As tabelas compartilhadas não podem ser tabelas temporárias, voláteis ou transitórias.

  • Tabelas externas não são suportadas.

Compartilhamento de conteúdo de dados em um pacote de aplicativo

Para incluir o conteúdo de dados em um pacote de aplicativo, você deve conceder privilégios no objeto a ser compartilhado com o pacote de aplicativo. Quando você adiciona um objeto a um pacote de aplicativo, por padrão, o objeto é privado para o pacote de aplicativo e não fica visível quando Snowflake Native App é instalado.

Para tornar os objetos visíveis ao Snowflake Native App instalado a partir do pacote de aplicativo, use o comando GRANT … TO SHARE IN APPLICATION PACKAGE como mostrado no exemplo a seguir:

CREATE APPLICATION PACKAGE app_package;

GRANT USAGE ON SCHEMA app_package.shared_schema
  TO SHARE IN APPLICATION PACKAGE app_package;
GRANT SELECT ON TABLE app_package.shared_schema.shared_table
  TO SHARE IN APPLICATION PACKAGE app_package;
Copy

Neste exemplo, o primeiro comando concede o privilégio USAGE no esquema shared_schema ao pacote do aplicativo, permitindo que ele seja compartilhado com os consumidores. O segundo comando concede o privilégio SELECT na tabela shared_table dentro de shared_schema ao pacote de aplicativo, permitindo que os consumidores consultem a tabela.

Depois que um consumidor instala um Snowflake Native App do pacote de aplicativo app_package, ele pode acessar o shared_schema e consultar o shared_table.

Nota

Ao adicionar um objeto compartilhado a um pacote de aplicativo, você também deve compartilhar o esquema que contém o objeto.

Você também pode compartilhar exibições com um aplicativo usando comandos SQL semelhantes.

Referência a objetos que existem fora do pacote de aplicativo

Para compartilhar um objeto de banco de dados que existe fora do pacote de aplicativo, você deve criar uma exibição dentro do pacote de aplicativo para acessar o objeto. Você não pode compartilhar objetos fora do pacote de aplicativo diretamente.

Antes de compartilhar um objeto em outro banco de dados, conceda o privilégio REFERENCE_USAGE nesse banco de dados para um compartilhamento no pacote de aplicativo, conforme mostrado no exemplo a seguir:

GRANT REFERENCE_USAGE ON DATABASE other_db
  TO SHARE IN APPLICATION PACKAGE app_pkg;
Copy

Depois de conceder o REFERENCE_USAGE no banco de dados externo, você deve criar uma exibição dentro do pacote de aplicativo que faça referência aos objetos compartilhados que foram compartilhados conforme mostrado no exemplo a seguir:

CREATE VIEW app_pkg.shared_schema.shared_view
  AS SELECT c1, c2, c3, c4
  FROM other_db.other_schema.other_table;
Copy

Este comando cria uma exibição no pacote de aplicativo que faz referência a um banco de dados, tabela e esquema fora do pacote de aplicativo.

Após criar a exibição, você deve conceder privilégios no esquema e exibição para o aplicativo conforme o exemplo a seguir:

GRANT USAGE ON SCHEMA app_pkg.shared_schema
  TO SHARE IN APPLICATION PACKAGE app_pkg;
GRANT SELECT ON VIEW app_pkg.shared_schema.shared_view
  TO SHARE IN APPLICATION PACKAGE app_pkg;
Copy

Permissão de acesso a objetos compartilhados em um aplicativo

Os objetos de banco de dados definidos e criados no script de configuração podem ser acessados diretamente por um Snowflake Native App após a instalação. Esses objetos podem incluir funções, procedimentos, novas definições de exibição etc.

Objetos de banco de dados fora do pacote de aplicativo só podem ser acessados por consumidores no Snowflake Native App instalado usando uma exibição segura definida no script de configuração.

O exemplo a seguir mostra como definir uma exibição no script de configuração.

CREATE VIEW IF NOT EXISTS inst_schema.shared_view
  AS SELECT c1, c2, c3, c4
  FROM shared_schema.shared_view;
Copy

Esta exibição acessa o conteúdo no shared_schema.shared_view que é compartilhado com o pacote de aplicativo como no exemplo da seção anterior.

Nota

Se você tentar definir uma exibição que acesse diretamente o conteúdo de dados compartilhados, como um objeto de banco de dados externo ao pacote de aplicativo, o Snowflake retornará um erro.

Exposição dos objetos compartilhados aos consumidores

Por padrão, os objetos de banco de dados compartilhados com um pacote de aplicativo não ficam visíveis para o consumidor. Para permitir que os consumidores visualizem e acessem o conteúdo dos dados, o pacote de aplicativo deve criar uma exibição segura e conceder os privilégios apropriados.

Essa abordagem oferece as seguintes vantagens:

  • A criação da exibição no script de configuração garante que as alterações feitas diretamente nos objetos compartilhados, como novas colunas, não fiquem visíveis para a versão do Snowflake Native App que está sendo instalado pelo script de configuração.

  • A criação da exibição em um esquema com versão garante que cada versão do Snowflake Native App contenha apenas a definição da exibição para essa versão. Isso é importante para cenários de atualização.

Para expor objetos compartilhados a um consumidor, o script de configuração deve incluir comandos para:

  • Instalar exibições dentro de um esquema com versão no pacote de aplicativo.

  • Conceder acesso a essas exibições ao consumidor usando uma função de aplicativo.

O exemplo a seguir descreve como usar funções de aplicativo para conceder acesso a objetos compartilhados no script de configuração do pacote de aplicativo:

CREATE APPLICATION ROLE app_user;

CREATE OR ALTER VERSIONED SCHEMA inst_schema;
GRANT USAGE ON SCHEMA inst_schema
  TO APPLICATION ROLE app_user;

CREATE VIEW IF NOT EXISTS inst_schema.shared_view
  AS SELECT c1, c2, c3, c4
  FROM shared_schema.shared_table;

GRANT SELECT ON VIEW inst_schema.shared_view
  TO APPLICATION ROLE app_user;
Copy

Como o Snowflake Native App Framework protege o conteúdo compartilhado

Para proteger a privacidade e a integridade do conteúdo de dados de um provedor, o Snowflake Native App Framework inclui a seguinte restrição:

  • Objetos compartilhados são somente leitura para um Snowflake Native App instalado.

  • Os objetos compartilhados não são expostos diretamente aos consumidores. Os objetos são expostos apenas por meio de uma exibição segura que é instalada quando o script de configuração é executado durante a instalação do Snowflake Native App.

  • Somente o provedor pode atualizar o conteúdo compartilhado.

  • Somente os seguintes objetos podem ser compartilhados com instâncias de um Snowflake Native App instalado com determinados privilégios:

    • Esquemas: apenas o privilégio USAGE pode ser concedido ao conteúdo compartilhado de um Snowflake Native App.

    • Tabelas: apenas o privilégio SELECT pode ser concedido ao conteúdo compartilhado de um Snowflake Native App. Tabelas com políticas definidas (acesso a linhas, mascaramento, baseada em tag etc.) não podem ser compartilhadas. As políticas podem ser definidas nos objetos quando eles são expostos aos consumidores.

    • Exibições: apenas o privilégio SELECT pode ser concedido ao conteúdo compartilhado de um pacote de aplicativo. Exibições com políticas definidas, incluindo acesso a linhas, mascaramento, baseada em tags etc., não podem ser compartilhadas.

Nota

A exibição, ou quaisquer exibições a partir das quais elas são compostas, não pode conter funções JavaScript, Java, Python ou Scala.

Para obter mais informações, consulte Exposição dos objetos compartilhados aos consumidores.

Restrições ao compartilhamento de conteúdo de dados com políticas

Os provedores não podem compartilhar tabelas e exibições com políticas, incluindo mascaramento, acesso a linhas e outros tipos de políticas. Essa restrição é necessária porque adicionar ou alterar políticas no lado do provedor pode interromper imediatamente as instâncias de um Snowflake Native App em execução.

Além disso, algumas funções comumente referenciadas por políticas, como CURRENT_USER, se comportam de maneira diferente no contexto de um pacote de aplicativo. Embora uma política definida por um provedor possa funcionar corretamente na conta do provedor, ela pode não funcionar quando o consumidor instala o Snowflake Native App.

A Snowflake recomenda que você defina políticas nas exibições de proxy especificadas no script de configuração. A definição de políticas nas exibições de proxy garante que a definição das políticas não possa ser alterada após a instalação de um Snowflake Native App. A definição de políticas em exibições de proxy também garante que, durante as atualizações, o código em execução continue a usar as políticas que foram aplicadas quando a versão foi criada.

Revogação e descarte de permissões em objetos compartilhados

Tenha cuidado ao revogar permissões em objetos compartilhados de um pacote de aplicativo ou ao descartar objetos compartilhados. Se uma versão instalada do Snowflake Native App ainda exigir acesso a esses objetos, o Snowflake Native App poderá ficar instável ou falhar.