여러 데이터베이스에서 데이터 공유하기

Snowflake 데이터 공급자는 보안 뷰를 사용하여 다른 데이터베이스에 위치한 데이터를 공유할 수 있습니다. 보안 뷰는 1개 이상의 데이터베이스에서 스키마, 테이블 및 기타 뷰 등의 오브젝트를 참조할 수 있지만, 해당 데이터베이스가 동일한 계정에 속해야 합니다.

여러 데이터베이스의 오브젝트를 참조하는 보안 뷰를 공유하는 프로세스는 단일 데이터베이스의 데이터를 공유하는 프로세스와 약간 다릅니다.

데이터를 공유하기 위한 모든 표준 단계를 수행해야 할 뿐만 아니라, 공유할 보안 뷰에서 참조하는 각 데이터베이스에 REFERENCE_USAGE 권한을 반드시 부여해야 합니다. 그러나 보안 뷰가 생성된 데이터베이스의 경우에는 REFERENCE_USAGE 권한을 부여할 필요가 없습니다.

중요

여러 데이터베이스의 오브젝트를 공유에 포함하도록 데이터베이스 역할 에 REFERENCE_USAGE 권한을 부여할 수 없습니다. 이 제한은 별개의 데이터베이스에 하나 이상의 기본 테이블이 있는 보안 뷰와 같은 오브젝트에도 적용됩니다.

공유에 여러 데이터베이스를 포함하려면 오브젝트에 대한 권한을 공유에 직접 부여해야 합니다. 이 옵션에 대한 자세한 내용은 옵션 2: 공유에 직접 권한 부여 섹션을 참조하십시오.

뷰에서 참조하는 각 데이터베이스에 권한을 별도로 부여한 후에 해당 뷰를 공유에 추가(즉, 뷰에 대한 SELECT 권한을 공유에 부여)해야 합니다.

여러 데이터베이스의 오브젝트를 참조하는 보안 뷰를 공유하려면:

  1. ACCOUNTADMIN 역할 또는 CREATE SHARES 전역 권한이 부여된 역할이 있는 사용자로 Snowflake 계정에 연결합니다. CREATE SHARES 권한에 대한 자세한 내용은 ACCOUNTADMIN 외 역할이 데이터 공유 작업을 수행할 수 있도록 설정 를 참조하십시오.

  2. CREATE SHARE 를 사용하여 공유 만들기

  3. GRANT <권한> … TO SHARE 를 사용하여 공유할 데이터베이스에 USAGE 권한을 부여합니다.

    참고

    여러 데이터베이스에 속한 오브젝트를 참조하는 보안 뷰를 공유하는 경우에는 보안 뷰가 생성된 데이터베이스에만 USAGE 권한을 부여해야 합니다. 공유당 1개의 데이터베이스에만 USAGE 권한을 부여할 수 있습니다.

  4. GRANT <권한> … TO SHARE 를 사용하여 공유할 데이터베이스의 각 스키마에 USAGE 권한을 부여합니다.

  5. GRANT <권한> … TO SHARE 를 사용하여 공유할 뷰에서 참조하는 오브젝트 등 각 추가 데이터베이스에 REFERENCE_USAGE 권한을 부여합니다.

  6. GRANT <권한> … TO SHARE 를 사용하여 공유할 뷰에 SELECT 권한을 부여합니다.

  7. ALTER SHARE 를 사용하여 공유에 1개 이상의 컨슈머 계정을 추가합니다.

이제 지정된 계정에서 공유를 사용할 수 있습니다.

예 1

데이터의 특성과 비즈니스 요구 사항에 따라 데이터를 다른 데이터베이스로 구성한 공급자가 해당 데이터베이스의 데이터와 다른 데이터베이스의 오브젝트(예: 스키마, 테이블, 뷰)를 조인하는 데이터베이스 1개에서 보안 뷰를 공유하려고 합니다.

Relationship between databases, database objects, shares, and accounts

샘플 코드:

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

예 2

공급자가 고객 데이터를 별도의 데이터베이스에 저장하고 해당 데이터베이스에서 새 오브젝트를 생성하지 않기를 원합니다. 데이터를 공유하려면 공급자는 보안 뷰가 있는 새 데이터베이스를 생성하면 됩니다. 보안 뷰는 고객 데이터가 포함된 데이터베이스의 오브젝트(스키마, 테이블, 뷰)를 참조합니다.

Relationship between databases, database objects, shares, and accounts

샘플 코드:

-- 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;
맨 위로 이동