Começando a utilizar o Secure Data Sharing

O Secure Data Sharing é um recurso extremamente poderoso e fácil de usar. Você pode começar como um provedor de dados com apenas alguns passos.

Este tópico introduz as tarefas necessárias para compartilhar um banco de dados e seus objetos com uma ou mais contas ao criar um compartilhamento. Você pode fornecer um compartilhamento aos consumidores usando compartilhamentos diretos ou listagens.

Neste tópico:

Como compartilhar objetos de banco de dados

Antes de continuar, determine qual das seguintes opções para adicionar objetos a um compartilhamento atende melhor às suas necessidades:

  • Opção 1. Conceder uma função de banco de dados a um compartilhamento:

    Segmente os objetos protegíveis em um compartilhamento, criando múltiplas funções de banco de dados em um banco de dados para um compartilhamento. Conceda privilégios em um subconjunto dos objetos do banco de dados para cada função do banco de dados. Em seguida, conceda cada função de banco de dados ao compartilhamento.

    Após criar um banco de dados a partir de um compartilhamento que inclui funções de banco de dados, os consumidores de dados concedem cada função de banco de dados compartilhada a uma ou mais funções de conta em sua própria conta.

    Sem funções de banco de dados, os administradores de contas em contas de consumidores de dados concedem um único privilégio, IMPORTED PRIVILEGES, para permitir que seus usuários acessem todos os bancos de dados e objetos de banco de dados (tabelas, exibições seguras etc.) em um compartilhamento. Não há opção para permitir que diferentes grupos de usuários em uma conta de consumidor de dados acessem um subconjunto dos objetos compartilhados. Esta abordagem de tudo ou nada exige que você crie várias ações para conceder acesso a diferentes objetos no mesmo banco de dados.

    Nota

    Escolha a Opção 2 se você planeja incluir objetos de vários bancos de dados em um único compartilhamento. 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.

    Como alternativa, você pode criar um compartilhamento que combine as opções 1 e 2. Ou seja, você pode conceder funções de banco de dados a um compartilhamento (Opção 1), mas também conceder privilégios em objetos diretamente ao mesmo compartilhamento sem conceder privilégios nesses objetos a uma função de banco de dados (Opção 2). Os consumidores de dados que criam bancos de dados a partir do compartilhamento podem acessar estes últimos objetos, concedendo o privilégio IMPORTED PRIVILEGES no banco de dados a funções locais.

    Dica

    Uma função de banco de dados compartilhada não oferece suporte a concessões futuras em objetos. Para obter mais detalhes, consulte GRANT DATABASE ROLE … TO SHARE.

  • Opção 2. Conceder privilégios em objetos diretamente a um compartilhamento:

    Concede privilégios em objetos específicos do banco de dados diretamente a um compartilhamento. Esta opção permite que você inclua objetos (por exemplo, tabelas e exibições seguras) de vários bancos de dados em um compartilhamento, desde que estes bancos de dados pertençam à mesma conta.

    Os administradores de contas em contas de consumidores de dados concedem o privilégio IMPORTED PRIVILEGES em bancos de dados compartilhados a uma ou mais funções para permitir que seus usuários acessem os bancos de dados e objetos de banco de dados (tabelas, exibições seguras etc.) em um compartilhamento.

    Note que esta opção não oferece suporte à segmentação de objetos de banco de dados em um compartilhamento baseado em funções. Para este nível de controle, consulte a Opção 1.

Opção 1: concessão de funções de banco de dados a um compartilhamento

Esta seção fornece instruções para que os provedores de dados restrinjam o acesso a bancos de dados e objetos de banco de dados em um compartilhamento, usando funções de banco de dados.

Nota

Para executar as tarefas descritas neste tópico, sua função deve ter os privilégios globais CREATE DATABASE e CREATE SHARE.

No exemplo detalhado ao longo desta seção, um provedor de dados compartilha os seguintes objetos com os consumidores de dados:

Bancos de dados

d1

Esquemas

d1.s1

Exibições seguras

d1.s1.v1

O conjunto de resultados para esta exibição inclui registros da tabela d1.s1.t1.

d1.s1.v2

O conjunto de resultados para esta exibição inclui registros das tabelas d1.s1.t2 e d1.s1.t3.

O provedor de dados cria duas funções no banco de dados d1 para controlar o acesso a esses objetos: d1.r1 e d1.r2.

O diagrama a seguir mostra as relações entre esses objetos e indica os privilégios que são concedidos às funções do banco de dados:

Data sharing with database roles example

Para obter mais informações sobre os privilégios, consulte Privilégios de controle de acesso.

Etapa 1: criar funções de banco de dados

Crie uma nova função de banco de dados ou substitua uma função de banco de dados existente usando CREATE DATABASE ROLE.

Por exemplo, crie funções de banco de dados d1.r1 e d1.r2 usando identificadores totalmente qualificados:

CREATE DATABASE ROLE d1.r1;

CREATE DATABASE ROLE d1.r2;
Copy

Como alternativa, defina o banco de dados desejado como o banco de dados atual na sessão, e então crie as funções do banco de dados:

USE DATABASE d1;

CREATE DATABASE ROLE r1;

CREATE DATABASE ROLE r2;
Copy

Etapa 2: conceder privilégios em objetos a funções de banco de dados

Conceda privilégios em um único banco de dados e subconjunto de objetos no banco de dados para cada função do banco de dados usando GRANT <privilégios>. Somente conceda privilégios em objetos aos quais a função de banco de dados deve permitir o acesso.

Especifique o nome totalmente qualificado de uma função de banco de dados ou defina o banco de dados como o banco de dados ativo em uma sessão e, em seguida, especifique o nome relativo.

Nota

  • Para executar as tarefas descritas neste tópico, você deve usar a função ACCOUNTADMIN ou uma função com os privilégios relevantes. Para obter mais informações, incluindo cenários adicionais de compartilhamento de dados, consulte Como trabalhar com compartilhamentos.

  • Os privilégios concedidos a uma função de banco de dados são limitados a USAGE no banco de dados e esquema que contém a função de banco de dados e privilégios em outros objetos no mesmo banco de dados. Em especial, note que 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.

Continuando o exemplo detalhado nestas instruções, os seguintes privilégios são concedidos às funções do banco de dados:

Função de banco de dados

Privilégio

Objeto

d1.r1

USAGE

Banco de dados d1

USAGE

Esquema d1.s1

SELECT

Exibição segura d1.s1.v1

d1.r2

USAGE

Banco de dados d1

USAGE

Esquema d1.s1

SELECT

Exibição segura d1.s1.v2

As seguintes instruções SQL concedem privilégios à função do banco de dados d1.r1:

GRANT USAGE ON SCHEMA d1.s1 TO DATABASE ROLE d1.r1;
GRANT SELECT ON VIEW d1.s1.v1 TO DATABASE ROLE d1.r1;
Copy

As seguintes instruções SQL concedem privilégios à função do banco de dados d1.r2:

GRANT USAGE ON SCHEMA d1.s1 TO DATABASE ROLE d1.r2;
GRANT SELECT ON VIEW d1.s1.v2 TO DATABASE ROLE d1.r2;
Copy

Note que não é necessário conceder o privilégio USAGE no banco de dados pai. Este privilégio é concedido implicitamente quando uma função de banco de dados é criada.

Para visualizar todos os privilégios concedidos a uma função de banco de dados, execute SHOW GRANTS TO DATABASE ROLE usando identificadores totalmente qualificados:

SHOW GRANTS TO DATABASE ROLE d1.r1;
SHOW GRANTS TO DATABASE ROLE d1.r2;
Copy

Como alternativa, defina o banco de dados desejado como o banco de dados atual na sessão e então execute o comando:

USE DATABASE d1;

SHOW GRANTS TO DATABASE ROLE r1;
SHOW GRANTS TO DATABASE ROLE r2;
Copy

Etapa 3: criar um compartilhamento

Criar um compartilhamento usando CREATE SHARE. O compartilhamento é um recipiente vazio neste estágio do processo.

Por exemplo, crie um novo compartilhamento chamado share1:

CREATE SHARE share1;
Copy

Etapa 4: adicionar o banco de dados concedendo o privilégio USAGE ao compartilhamento

Atualmente, é necessário conceder o privilégio USAGE em um banco de dados para incluí-lo em um compartilhamento.

Por exemplo, conceda o privilégio USAGE no banco de dados d1 para o compartilhamento share1:

GRANT USAGE ON DATABASE d1 TO SHARE share1;
Copy

Etapa 5: adicionar objetos ao conceder funções de banco de dados ao compartilhamento

Adicione bancos de dados e objetos de banco de dados a um compartilhamento, concedendo funções de banco de dados ao compartilhamento usando GRANT DATABASE ROLE … TO SHARE.

Por exemplo, conceda funções de banco de dados d1.r1 e d1.r2 para o compartilhamento share1:

GRANT DATABASE ROLE d1.r1 TO SHARE share1;
GRANT DATABASE ROLE d1.r2 TO SHARE share1;
Copy

Etapa 6: compartilhar os objetos de banco de dados com uma ou mais contas de consumidores de dados

Modifique o compartilhamento ALTER SHARE … ADD ACCOUNTS e adicione as contas de consumidor do banco de dados com as quais você deseja compartilhar os objetos de banco de dados.

O exemplo seguinte adiciona contas consumer1 e consumer2 na organização org1 para o compartilhamento share1:

ALTER SHARE share1 ADD ACCOUNTS = org1.consumer1,org1.consumer2;
Copy

Gerenciamento de funções de bancos de dados

Esta seção fornece instruções para gerenciar as funções de banco de dados que são concedidas aos compartilhamentos.

Provedores de dados: renomeação de funções de banco de dados compartilhadas

Renomeie as funções do banco de dados usando uma instrução ALTER DATABASE ROLE … RENAME TO.

Por exemplo, renomeie a função de banco de dados d1.r1 como d1.r3:

ALTER DATABASE ROLE d1.r1 RENAME TO d1.r3;
Copy

Todos os privilégios concedidos a d1.r1 são mantidos após a renomeação da função do banco de dados.

Notifique qualquer consumidor de dados de um compartilhamento que o nome da função de banco de dados tenha mudado.

É proibido mover uma função de banco de dados para um banco de dados diferente usando a cláusula RENAME TO. Por exemplo:

ALTER DATABASE ROLE d1.r1 RENAME TO d2.r1;
Copy

Provedores de dados: descarte de funções de banco de dados compartilhadas

Descarte as funções de banco de dados usando DROP DATABASE ROLE.

Por exemplo, descarte a função de banco de dados d1.r2:

DROP DATABASE ROLE d1.r2;
Copy

Notifique qualquer consumidor de dados de um compartilhamento que inclua a função de banco de dados. O acesso a qualquer objeto concedido à função de banco de dados é revogado.

Provedores de dados: criação de novas funções de banco de dados compartilhadas

Crie novas funções de banco de dados usando CREATE DATABASE ROLE. Para obter mais informações, consulte Etapa 1: criar funções de banco de dados (neste tópico). Conceda privilégios em objetos de banco de dados a uma função de banco de dados, e depois conceda a função de banco de dados a um compartilhamento.

Notifique qualquer consumidor de dados de um compartilhamento que inclua a nova função de banco de dados. Eles devem conceder a nova função de banco de dados a suas próprias funções de conta para permitir que essas funções tenham acesso aos objetos associados à função de banco de dados.

Opção 2: concessão de privilégios diretamente a um compartilhamento

Esta seção fornece instruções para que os provedores de dados permitam aos consumidores acessar todos os bancos de dados e objetos de banco de dados em um compartilhamento, concedendo um único privilégio nos bancos de dados compartilhados.

Passo 1: criar um compartilhamento

Use CREATE SHARE para criar um compartilhamento. Neste passo, o compartilhamento é simplesmente um recipiente esperando que objetos e contas sejam adicionados.

Passo 2: adicionar objetos ao compartilhamento através da concessão privilégios

Utilize GRANT <privilégio> … TO SHARE para conceder os seguintes privilégios de objeto ao compartilhamento:

  • Privilégio de USAGE sobre o banco de dados que você deseja compartilhar.

  • Privilégio de USAGE em cada esquema de banco de dados contendo os objetos que você deseja compartilhar.

  • Privilégio SELECT de compartilhar objetos específicos em cada esquema compartilhado:

    • Tabelas

    • Tabelas externas

    • Exibições seguras

    • Exibições materializadas seguras

    • UDFs seguros

Importante

Se você planeja compartilhar dados com segurança com consumidores em diferentes regiões ou plataformas de nuvem, observe que, atualmente, a replicação de um banco de dados primário é bloqueada se houver uma ou mais tabelas externas no banco de dados.

Nota

Não é recomendado criar uma exibição segura em fluxos e depois compartilhar essas exibições com os consumidores. Em vez disso, permita que os consumidores criem seus próprios fluxos nas tabelas e protejam as exibições que você compartilha. Para obter mais informações, consulte Fluxos em objetos compartilhados.

Opcionalmente, utilize SHOW GRANTS para visualizar as concessões de objetos para o compartilhamento.

Dica

Realize esta quantidade mínima de validação do compartilhamento neste ponto, pois após completar o próximo passo, o compartilhamento ficará visível para todas as contas que são adicionadas ao compartilhamento.

Para realizar uma validação mais profunda do compartilhamento, você poderá simular uma conta de consumidor em sua conta. Para obter mais detalhes, consulte Uso de objetos seguros para controlar o acesso aos dados.

Passo 3: adicionar uma ou mais contas ao compartilhamento

Utilize ALTER SHARE para adicionar uma ou mais contas ao compartilhamento. Para examinar as contas adicionadas ao compartilhamento, você pode usar SHOW GRANTS.

Agora o compartilhamento está pronto para ser consumido pelas contas especificadas. Para obter instruções mais detalhadas para executar estas e outras tarefas do provedor de dados, consulte Como trabalhar com compartilhamentos.

Exemplo

O exemplo a seguir ilustra o processo de provedor em sua totalidade, conforme descrito acima.

Note que este exemplo considera que:

  • existe um banco de dados chamado sales_db com um esquema chamado aggregates_eula e uma tabela chamada aggregate_1.

  • o banco de dados, o esquema e a tabela serão compartilhados com duas contas denominadas xy12345 e yz23456.

USE ROLE accountadmin;

CREATE SHARE sales_s;

GRANT USAGE ON DATABASE sales_db TO SHARE sales_s;
GRANT USAGE ON SCHEMA sales_db.aggregates_eula TO SHARE sales_s;
GRANT SELECT ON TABLE sales_db.aggregates_eula.aggregate_1 TO SHARE sales_s;

SHOW GRANTS TO SHARE sales_s;

ALTER SHARE sales_s ADD ACCOUNTS=xy12345, yz23456;

SHOW GRANTS OF SHARE sales_s;
Copy