Partage de données de plusieurs bases de données

Les fournisseurs de données Snowflake peuvent partager des données résidant dans différentes bases de données à l’aide de vues sécurisées. Une vue sécurisée peut référencer des objets tels que des schémas, des tables et d’autres vues à partir d’une ou de plusieurs bases de données, à condition que ces bases de données appartiennent au même compte.

Le processus de partage d’une vue sécurisée faisant référence à des objets de plusieurs bases de données diffère légèrement du partage de données résidant dans une seule base de données.

En plus d’effectuer toutes les étapes standard pour partager des données, vous devez également accorder le privilège REFERENCE_USAGE à chaque base de données référencée par une vue sécurisée que vous souhaitez partager. Cependant, vous n’avez pas besoin d’accorder REFERENCE_USAGE sur la base de données où la vue sécurisée est créée.

Important

Le privilège REFERENCE_USAGE ne peut pas être accordé à un rôle de base de données pour inclure des objets de plusieurs bases de données dans un partage. Notez que cette limitation s’applique également aux objets tels que les vues sécurisées qui ont une ou plusieurs tables sous-jacentes dans une base de données séparée.

Pour inclure plusieurs bases de données dans un partage, vous devez accorder des privilèges sur les objets directement au partage. Pour plus d’informations sur cette option, voir Option 2 : Accorder des privilèges directement à un partage.

Vous devez octroyer le privilège séparément sur chaque base de données référencée dans une vue avant d’ajouter la vue à un partage (c’est-à-dire accorder SELECT à la vue d’un partage).

Pour partager une vue sécurisée faisant référence à des objets de plusieurs bases de données :

  1. Connectez-vous à votre compte Snowflake en tant qu’utilisateur avec le rôle ACCOUNTADMIN ou un rôle doté du privilège global CREATE SHARES. Pour plus de détails sur le privilège CREATE SHARES, voir Capacité des rôles non ACCOUNTADMIN à effectuer des tâches de partage de données.

  2. Créez un partage à l’aide de CREATE SHARE.

  3. Accordez le privilège USAGE sur la base de données que vous souhaitez partager avec GRANT <privilège> … TO SHARE.

    Note

    Si vous partagez une vue sécurisée faisant référence à des objets appartenant à plusieurs bases de données, vous devez accorder le privilège USAGE uniquement à la base de données où la vue sécurisée est créée. Vous ne pouvez accorder USAGE qu’à une seule base de données par partage.

  4. Accordez le privilège USAGE sur chaque schéma de la base de données que vous souhaitez partager à l’aide de GRANT <privilège> … TO SHARE.

  5. Accordez le privilège REFERENCE_USAGE sur chaque base de données supplémentaire contenant des objets référencés par la vue que vous souhaitez partager à l’aide de GRANT <privilège> … TO SHARE.

  6. Accordez le privilège SELECT sur la vue que vous souhaitez partager à l’aide de GRANT <privilège> … TO SHARE.

  7. Ajoutez un ou plusieurs comptes au partage avec ALTER SHARE.

Le partage peut maintenant être consommé par les comptes indiqués.

Exemples

Exemple 1

Un fournisseur qui a organisé les données dans différentes bases de données en fonction des caractéristiques des données et des besoins de l’entreprise souhaite partager une vue sécurisée dans une base de données qui associe les données de cette base à des objets (par exemple, un schéma, une table, une vue) provenant d’autres bases.

Relationship between databases, database objects, shares, and accounts

Exemple de code :

-- 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

Exemple 2

Un fournisseur stocke les données client dans des bases de données distinctes et ne veut pas créer de nouveaux objets dans ces bases de données. Pour partager des données, le fournisseur crée une nouvelle base de données avec une vue sécurisée. La vue sécurisée référence des objets (schéma, table, vue) dans les bases de données avec les données du client.

Relationship between databases, database objects, shares, and accounts

Exemple de code :

-- 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