Compartilhamento de dados a partir de diversos bancos de dados

Os provedor de dados do Snowflake podem compartilhar dados que se encontram em diferentes bancos de dados, utilizando exibições seguras. Uma exibição segura pode fazer referência a objetos como esquemas, tabelas e outras exibições de um ou mais bancos de dados, desde que esses bancos de dados pertençam à mesma conta.

O processo de compartilhamento de uma exibição segura que faça referência a objetos de vários bancos de dados é ligeiramente diferente do compartilhamento de dados que se encontram em um único banco de dados.

Além de realizar todos os passos padrão para o compartilhamento de dados, você deve conceder o privilégio REFERENCE_USAGE em cada um dos bancos de dados referenciados por uma exibição segura que você deseje compartilhar. Entretanto, você não precisa conceder REFERENCE_USAGE no banco de dados em que a exibição segura é criada.

Importante

O privilégio REFERENCE_USAGE não pode ser concedido a uma função de banco de dados para incluir objetos de múltiplos bancos de dados em um compartilhamento. Note que esta limitação também se aplica a objetos como exibições seguras que têm uma ou mais tabelas subjacentes em um banco de dados separado.

Para incluir vários bancos de dados em um compartilhamento, você deve conceder privilégios nos objetos diretamente ao compartilhamento. Para obter mais informações sobre esta opção, consulte Opção 2: Concessão de privilégios diretamente a um compartilhamento.

Você deve conceder o privilégio separadamente em cada banco de dados referenciado em uma exibição, antes de adicionar a exibição a um compartilhamento (ou seja, conceder SELECT sobre a visão a um compartilhamento).

Para compartilhar uma exibição segura que faz referência a objetos de diversos bancos de dados:

  1. Conecte-se à sua conta Snowflake como um usuário com a função ACCOUNTADMIN ou uma função à qual é concedido o privilégio global CREATE SHARES. Para obter mais detalhes sobre o privilégio CREATE SHARES, consulte Habilitação de funções diferentes de ACCOUNTADMIN a executar tarefas de compartilhamento de dados.

  2. Criar um compartilhamento usando CREATE SHARE.

  3. Conceda o privilégio USAGE sobre o banco de dados que você deseja compartilhar usando GRANT <privilégio> … TO SHARE.

    Nota

    Se estiver compartilhando uma exibição segura que faz referência a objetos pertencentes a diversos bancos de dados, você deve conceder o privilégio USAGE somente ao banco de dados em que a exibição segura é criada. Você só pode conceder USAGE a um banco de dados por compartilhamento.

  4. Conceda o privilégio USAGE sobre cada esquema no banco de dados que você deseja compartilhar, usando GRANT <privilégio> … TO SHARE.

  5. Conceda o privilégio REFERENCE_USAGE sobre cada banco de dados adicional que contenha objetos referenciados pela exibição que você deseja compartilhar, usando GRANT <privilégio> … TO SHARE.

  6. Conceda o privilégio SELECT sobre a visualização que você deseja compartilhar usando GRANT <privilégio> … TO SHARE.

  7. Adicionar uma ou mais contas de consumidor ao compartilhamento usando ALTER SHARE.

Agora o compartilhamento está pronto para ser consumido pelas contas especificadas.

Exemplos

Exemplo 1

Um provedor que organizou os dados em diferentes bancos de dados com base nas características dos dados e nas necessidades comerciais deseja compartilhar uma exibição segura em um banco de dados que junta os dados deste banco de dados com objetos (por exemplo: esquema, tabela, exibição) de outros bancos de dados.

Relationship between databases, database objects, shares, and accounts

Código de exemplo:

-- Sample database database1
CREATE DATABASE database1;
CREATE SCHEMA database1.sch;
CREATE TABLE database1.sch.table1 (id int);
CREATE VIEW database1.sch.view1 AS SELECT * FROM database1.sch.table1;

-- Sample database database2
CREATE DATABASE database2;
CREATE SCHEMA database2.sch;
CREATE TABLE database2.sch.table2 (id int);

-- Sample database to be shared
CREATE DATABASE database3;
CREATE SCHEMA database3.sch;

-- Create a table in the database to be shared.
CREATE TABLE database3.sch.table3 (id int);

-- Sample view to be shared.
-- This will require granting REFERENCE_USAGE on database1 and database2
CREATE SECURE VIEW database3.sch.view3 AS
SELECT view1.id AS View1Id, table2.id AS table2id, table3.id as table3id
FROM database1.sch.view1 view1,
     database2.sch.table2 table2,
     database3.sch.table3 table3;

CREATE SHARE Share1;
GRANT USAGE ON DATABASE database3 TO SHARE share1;
GRANT USAGE ON SCHEMA database3.sch TO SHARE share1;

GRANT REFERENCE_USAGE ON DATABASE database1 TO SHARE share1;
GRANT REFERENCE_USAGE ON DATABASE database2 TO SHARE share1;

GRANT SELECT ON VIEW database3.sch.view3 TO SHARE share1;
Copy

Exemplo 2

Um provedor armazena dados de clientes em bancos de dados separados e não deseja criar novos objetos nesses bancos de dados. Para compartilhar dados, o provedor cria um novo banco de dados com uma exibição segura. A exibição segura faz referência a objetos (esquema, tabela, exibição) nos bancos de dados com dados de cliente.

Relationship between databases, database objects, shares, and accounts

Código de exemplo:

-- Sample database customer1DB
CREATE DATABASE customer1DB;
CREATE SCHEMA customer1DB.sch;
CREATE TABLE customer1DB.sch.table1 (id int);
CREATE VIEW customer1DB.sch.view1 AS SELECT * FROM customer1DB.sch.table1;

-- Sample database customer2DB
CREATE DATABASE customer2DB;
CREATE SCHEMA customer2DB.sch;
CREATE TABLE customer2DB.sch.table2 (id int);

-- Sample database to be shared
CREATE DATABASE newDB;
CREATE SCHEMA newDB.sch;
-- Sample view to be shared
-- This will require granting REFERENCE_USAGE on customer1DB and customer2DB
CREATE SECURE VIEW newDB.sch.view3 AS
SELECT view1.id AS view1Id, table2.id AS table2ID
FROM customer1DB.sch.view1 view1,
   customer2DB.sch.table2 table2;

CREATE SHARE share1;
GRANT USAGE ON DATABASE newDB TO SHARE share1;
GRANT USAGE ON SCHEMA newDB.sch TO SHARE share1;

GRANT REFERENCE_USAGE ON DATABASE customer1DB TO SHARE share1;
GRANT REFERENCE_USAGE ON DATABASE customer2DB TO SHARE share1;

GRANT SELECT ON VIEW newDB.sch.view3 TO SHARE share1;
Copy