여러 데이터베이스의 데이터 공유하기

여러 데이터베이스의 데이터 공유하기

Snowflake 데이터 프로바이더는 보안 뷰(secure view)를 사용해 여러 데이터베이스의 데이터를 공유할 수 있어요. 보안 뷰는 이 데이터베이스들이 같은 계정에 속하는 한, 하나 이상의 데이터베이스에 포함된 스키마·테이블·다른 뷰 같은 객체를 참조할 수 있어요.

출처: Snowflake User Guide - Share data from multiple databases

본문

여러 데이터베이스의 객체를 참조하는 보안 뷰를 공유하는 것은 단일 데이터베이스에 포함된 데이터를 공유하는 것과 달라요. 데이터 공유의 모든 표준 단계를 수행하는 것 외에도, 공유하려는 보안 뷰가 참조하는 각 데이터베이스에 REFERENCE_USAGE 권한을 부여해야 해요. 다만 보안 뷰를 포함하는 데이터베이스에는 REFERENCE_USAGE를 부여할 필요가 없어요.

참고: 여러 데이터베이스의 데이터를 공유하는 데 데이터베이스 역할(database role)을 사용할 수 없어요. REFERENCE_USAGE 권한을 데이터베이스 역할에 부여할 수 없고, 데이터베이스 역할로 여러 데이터베이스의 객체를 참조하는 보안 뷰를 셰어에 부여할 수도 없어요. 보안 뷰를 셰어에 부여하기 전에 보안 뷰에서 참조되는 각 데이터베이스에 REFERENCE_USAGE 권한을 별도로 부여해야 해요.

여러 데이터베이스의 객체를 참조하는 보안 뷰를 공유하려면:

  1. ACCOUNTADMIN 역할 또는 전역 CREATE SHARE 권한이 부여된 역할을 가진 사용자로 Snowflake 계정에 연결해요.
  2. CREATE SHARE로 셰어를 만들어요.
  3. GRANT <privilege> … TO SHARE로 공유하려는 데이터베이스에 대한 USAGE 권한을 부여해요.

    참고: 여러 데이터베이스에 포함된 객체를 참조하는 보안 뷰를 공유한다면, 보안 뷰가 만들어진 데이터베이스에만 USAGE 권한을 부여하면 돼요. 셰어당 하나의 데이터베이스에만 USAGE를 부여할 수 있어요. 데이터베이스에 USAGE 권한을 부여하면 셰어가 데이터베이스와 연결되고, 이는 셰어에 다른 권한을 부여하는 데 필요해요.

  4. GRANT <privilege> … TO SHARE로 공유하려는 데이터베이스 안의 각 스키마에 대한 USAGE 권한을 부여해요.
  5. GRANT <privilege> … TO SHARE로 공유하려는 뷰가 참조하는 객체를 포함한 각 추가 데이터베이스에 대한 REFERENCE_USAGE 권한을 부여해요.
  6. GRANT <privilege> … TO SHARE로 뷰에 대한 SELECT 권한을 부여해 뷰를 셰어에 추가해요.
  7. ALTER SHARE로 셰어에 소비자 계정을 하나 이상 추가해요.

이제 셰어는 지정된 계정이 소비할 준비가 됐어요.

참고: 다른 데이터베이스의 UDF를 참조하는 보안 뷰를 공유하려면 그 UDF를 보안 UDF로 만들어야 해요.

예시

예시 1: 기존 데이터베이스에 보안 뷰 만들고 공유하기

데이터의 특성과 비즈니스 요구에 따라 데이터를 서로 다른 데이터베이스로 구성하는 프로바이더가, 한 데이터베이스 안에서 이 데이터베이스의 데이터를 다른 데이터베이스의 객체(예: 스키마, 테이블, 뷰)와 조인하는 보안 뷰를 공유하고 싶어 해요.

  1. 데이터베이스 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;
    
  2. 데이터베이스 database2와 데이터를 만들어요.
    CREATE DATABASE database2;
    CREATE SCHEMA database2.sch;
    CREATE TABLE database2.sch.table2 (id INT);
    
  3. 데이터베이스 database3과 데이터를 만들어요.
    CREATE DATABASE database3;
    CREATE SCHEMA database3.sch;
    CREATE TABLE database3.sch.table3 (id INT);
    
  4. 공유할 데이터가 있는 database3에 보안 뷰를 만들어요.
    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;
    
  5. 셰어를 만들고 셰어를 설정하는 데 필요한 권한을 부여해요.
    CREATE SHARE share1;
    GRANT USAGE ON DATABASE database3 TO SHARE share1;
    GRANT USAGE ON SCHEMA database3.sch TO SHARE share1;
    
  6. 보안 뷰 view3를 셰어에 추가하는 데 필요한 권한을 부여해요. 보안 뷰 view3가 추가 데이터베이스에서 참조하는 데이터에는 database1과 database2에 대한 REFERENCE_USAGE 권한을 셰어에 부여해야 해요.
    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;
    

이 데이터를 다른 리전의 소비자와 공유하려면 복제 그룹(replication group)으로 데이터를 다른 리전의 계정에 복제하면 돼요.

예시 2: 별도의 데이터베이스에 보안 뷰 만들고 공유하기

프로바이더가 고객 데이터를 별도의 데이터베이스에 저장하고 그 데이터베이스에 새 객체를 만들고 싶지 않다고 가정해요. 데이터를 공유하기 위해 프로바이더는 보안 뷰가 있는 새 데이터베이스를 만들어요. 이 보안 뷰는 고객 데이터가 있는 데이터베이스의 객체(스키마, 테이블, 뷰)를 참조해요.

  1. 고객 데이터베이스 customer1_db와 데이터를 만들어요.
    CREATE DATABASE customer1_db;
    CREATE SCHEMA customer1_db.sch;
    CREATE TABLE customer1_db.sch.table1 (id INT);
    CREATE VIEW customer1_db.sch.view1 AS SELECT * FROM customer1_db.sch.table1;
    
  2. 고객 데이터베이스 customer2_db와 데이터를 만들어요.
    CREATE DATABASE customer2_db;
    CREATE SCHEMA customer2_db.sch;
    CREATE TABLE customer2_db.sch.table2 (id INT);
    
  3. 새 데이터베이스 new_db와 스키마 sch를 만들어요.
    CREATE DATABASE new_db;
    CREATE SCHEMA new_db.sch;
    
  4. customer1_db와 customer2_db의 객체를 참조하는 보안 뷰를 new_db에 만들어요.
    CREATE SECURE VIEW new_db.sch.view3 AS
      SELECT view1.id AS view1Id,
             table2.id AS table2ID
      FROM customer1_db.sch.view1 view1,
           customer2_db.sch.table2 table2;
    
  5. 셰어를 만들고 셰어를 설정하는 데 필요한 권한을 부여해요.
    CREATE SHARE share1;
    GRANT USAGE ON DATABASE new_db TO SHARE share1;
    GRANT USAGE ON SCHEMA new_db.sch TO SHARE share1;
    
  6. 보안 뷰 view3를 셰어에 추가하는 데 필요한 권한을 부여해요. 보안 뷰 view3가 추가 데이터베이스에서 참조하는 데이터에는 customer1_db와 customer2_db에 대한 REFERENCE_USAGE 권한을 셰어에 부여해야 해요.
    GRANT REFERENCE_USAGE ON DATABASE customer1_db TO SHARE share1;
    GRANT REFERENCE_USAGE ON DATABASE customer2_db TO SHARE share1;
    GRANT SELECT ON VIEW new_db.sch.view3 TO SHARE share1;
    

다른 리전의 소비자와 여러 데이터베이스의 데이터 공유하기

복제 그룹을 사용해 다른 리전과 클라우드 플랫폼의 소비자 계정과 여러 데이터베이스의 데이터를 공유할 수 있어요. 셰어와 그 셰어가 참조하는 각 데이터베이스를 그룹에 포함해 다른 리전의 Snowflake 계정으로 데이터를 복제해요. 그런 뒤 복제된 셰어에 소비자 계정을 추가할 수 있어요.

더 알아보기