여러 데이터베이스의 데이터 공유하기
여러 데이터베이스의 데이터 공유하기
Snowflake 데이터 프로바이더는 보안 뷰(secure view)를 사용해 여러 데이터베이스의 데이터를 공유할 수 있어요. 보안 뷰는 이 데이터베이스들이 같은 계정에 속하는 한, 하나 이상의 데이터베이스에 포함된 스키마·테이블·다른 뷰 같은 객체를 참조할 수 있어요.
출처: Snowflake User Guide - Share data from multiple databases
본문
여러 데이터베이스의 객체를 참조하는 보안 뷰를 공유하는 것은 단일 데이터베이스에 포함된 데이터를 공유하는 것과 달라요. 데이터 공유의 모든 표준 단계를 수행하는 것 외에도, 공유하려는 보안 뷰가 참조하는 각 데이터베이스에 REFERENCE_USAGE 권한을 부여해야 해요. 다만 보안 뷰를 포함하는 데이터베이스에는 REFERENCE_USAGE를 부여할 필요가 없어요.
참고: 여러 데이터베이스의 데이터를 공유하는 데 데이터베이스 역할(database role)을 사용할 수 없어요.
REFERENCE_USAGE권한을 데이터베이스 역할에 부여할 수 없고, 데이터베이스 역할로 여러 데이터베이스의 객체를 참조하는 보안 뷰를 셰어에 부여할 수도 없어요. 보안 뷰를 셰어에 부여하기 전에 보안 뷰에서 참조되는 각 데이터베이스에REFERENCE_USAGE권한을 별도로 부여해야 해요.
여러 데이터베이스의 객체를 참조하는 보안 뷰를 공유하려면:
ACCOUNTADMIN역할 또는 전역CREATE SHARE권한이 부여된 역할을 가진 사용자로 Snowflake 계정에 연결해요.CREATE SHARE로 셰어를 만들어요.GRANT <privilege> … TO SHARE로 공유하려는 데이터베이스에 대한USAGE권한을 부여해요.참고: 여러 데이터베이스에 포함된 객체를 참조하는 보안 뷰를 공유한다면, 보안 뷰가 만들어진 데이터베이스에만
USAGE권한을 부여하면 돼요. 셰어당 하나의 데이터베이스에만USAGE를 부여할 수 있어요. 데이터베이스에USAGE권한을 부여하면 셰어가 데이터베이스와 연결되고, 이는 셰어에 다른 권한을 부여하는 데 필요해요.GRANT <privilege> … TO SHARE로 공유하려는 데이터베이스 안의 각 스키마에 대한USAGE권한을 부여해요.GRANT <privilege> … TO SHARE로 공유하려는 뷰가 참조하는 객체를 포함한 각 추가 데이터베이스에 대한REFERENCE_USAGE권한을 부여해요.GRANT <privilege> … TO SHARE로 뷰에 대한SELECT권한을 부여해 뷰를 셰어에 추가해요.ALTER SHARE로 셰어에 소비자 계정을 하나 이상 추가해요.
이제 셰어는 지정된 계정이 소비할 준비가 됐어요.
참고: 다른 데이터베이스의 UDF를 참조하는 보안 뷰를 공유하려면 그 UDF를 보안 UDF로 만들어야 해요.
예시
예시 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; - 데이터베이스
database2와 데이터를 만들어요.CREATE DATABASE database2; CREATE SCHEMA database2.sch; CREATE TABLE database2.sch.table2 (id INT); - 데이터베이스
database3과 데이터를 만들어요.CREATE DATABASE database3; CREATE SCHEMA database3.sch; CREATE TABLE database3.sch.table3 (id INT); - 공유할 데이터가 있는
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; - 셰어를 만들고 셰어를 설정하는 데 필요한 권한을 부여해요.
CREATE SHARE share1; GRANT USAGE ON DATABASE database3 TO SHARE share1; GRANT USAGE ON SCHEMA database3.sch TO SHARE share1; - 보안 뷰
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: 별도의 데이터베이스에 보안 뷰 만들고 공유하기
프로바이더가 고객 데이터를 별도의 데이터베이스에 저장하고 그 데이터베이스에 새 객체를 만들고 싶지 않다고 가정해요. 데이터를 공유하기 위해 프로바이더는 보안 뷰가 있는 새 데이터베이스를 만들어요. 이 보안 뷰는 고객 데이터가 있는 데이터베이스의 객체(스키마, 테이블, 뷰)를 참조해요.
- 고객 데이터베이스
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; - 고객 데이터베이스
customer2_db와 데이터를 만들어요.CREATE DATABASE customer2_db; CREATE SCHEMA customer2_db.sch; CREATE TABLE customer2_db.sch.table2 (id INT); - 새 데이터베이스
new_db와 스키마sch를 만들어요.CREATE DATABASE new_db; CREATE SCHEMA new_db.sch; 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;- 셰어를 만들고 셰어를 설정하는 데 필요한 권한을 부여해요.
CREATE SHARE share1; GRANT USAGE ON DATABASE new_db TO SHARE share1; GRANT USAGE ON SCHEMA new_db.sch TO SHARE share1; - 보안 뷰
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 계정으로 데이터를 복제해요. 그런 뒤 복제된 셰어에 소비자 계정을 추가할 수 있어요.