가져온 데이터 소비하기
가져온 데이터 소비하기
이 주제는 데이터 프로바이더가 제공한 셰어(share)에서 데이터베이스를 만들고, 그 데이터베이스를 쿼리나 다른 연산에 사용하는 것과 관련된 작업을 설명해요.
본문
이 작업들을 수행하려면 ACCOUNTADMIN 역할(또는 IMPORT SHARE 전역 권한이 부여된 역할)을 사용해야 해요.
참고: 이 주제의 작업은 리더 계정(reader account)에는 적용되지 않아요. 리더 계정으로 가져온 데이터를 소비한다면, 프로바이더 계정의 관리자가 이미 완료했으므로 이 작업 중 어느 것도 수행할 필요가 없어요.
가져온 데이터베이스의 일반적 제한 사항
소비자 관점에서 가져온(imported) 데이터베이스에는 다음 제한이 있어요.
- 가져온 데이터베이스는 읽기 전용이에요. 소비자 계정의 사용자는 데이터를 보고 쿼리할 수 있지만, 데이터를 삽입·갱신하거나 데이터베이스 안에 어떤 객체를 만들 수는 없어요.
- 다음 작업은 지원되지 않아요.
- 가져온 데이터베이스나 그 안의 스키마·테이블의 클론 만들기
- 가져온 데이터베이스나 그 안의 스키마·테이블에 대한 타임 트래블(Time Travel)
- 가져온 데이터베이스의 주석(comment) 편집
- 가져온 데이터베이스 안 테이블에 스토리지 수명 주기 정책(storage lifecycle policy) 연결
- 재공유(resharing)가 허용될 때만 가져온 데이터베이스를 재공유할 수 있어요.
SHOW DATABASES를 실행해 가져온 데이터베이스의resharing_settings컬럼을 확인해요. 재공유 워크플로는 아래 재공유(Resharing)하기를 참고해요. - 가져온 데이터베이스는 복제할 수 없어요.
사용 가능한 셰어 보기
웹 인터페이스나 SQL로 계정에서 소비할 수 있는 셰어를 볼 수 있어요.
웹 인터페이스로 보려면:
- 나와 공유된 셰어를 보려면 탐색 메뉴에서 Data sharing » Internal sharing을 선택한 뒤 Shared With You를 선택해요. 이 페이지에서 다음을 볼 수 있어요.
- 나와 공유된 Privately Shared Listing과 접근 권한이 있는 Data exchange listing
- 나와 공유된 직접 셰어(direct share) — 셰어 상태에 따라 두 섹션으로 그룹화돼요: (1) 아직 가져올 준비가 된 직접 셰어(즉 셰어에서 데이터베이스를 아직 만들지 않음), (2) 데이터베이스로 가져와 쿼리할 준비가 된 직접 셰어
- 데이터베이스로 가져와 쿼리할 준비가 된 Snowflake Marketplace listing을 보려면 Snowsight에 로그인한 뒤 탐색 메뉴에서 Marketplace » Snowflake Marketplace를 선택해요.
SHOW SHARES 또는 DESCRIBE SHARE 문을 실행해도 돼요. 예:
SHOW SHARES;
출력은 다음을 보여줘요.
sales_s와sales_s2두 셰어가 사용 가능해요.kind컬럼의INBOUND는 데이터 프로바이더가 소비를 위해 당신 계정에 셰어를 제공했음을 나타내요.name컬럼은 각 셰어의 이름을share_name형태로 표시해요 (예:SALES_S).owner_account컬럼은 각 셰어를 제공한 계정 이름을orgname.account_name형태로 표시해요.database_name컬럼이 비어 있으면 당신 계정에서 아직 그 셰어로 데이터베이스를 만들지 않았다는 뜻이에요.
+-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+
| created_on | kind | owner_account | name | database_name | to | owner | comment | listing_global_name |
|-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------|---------------------|
| 2017-07-09 19:18:09.821 -0700 | INBOUND | SNOW.XY12345 | SALES_S2 | UPDATED_SALES_DB | | | Transformed and updated sales data | |
| 2017-06-15 17:02:29.625 -0700 | OUTBOUND | SNOW.MY_TEST_ACCOUNT | SALES_S | SALES_DB | XY12345, YZ23456 | ACCOUNTADMIN | | |
+-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+
DESCRIBE SHARE 예시
다음 예시는 DESCRIBE SHARE 명령으로 sales_s 셰어 안의 객체(데이터베이스, 스키마, 테이블)를 보여줘요.
DESC SHARE xy12345.sales_s;
+----------+------------------------------------+---------------------------------+
| kind | name | shared_on |
|----------+------------------------------------+---------------------------------|
| DATABASE | <DB> | Thu, 15 Jun 2017 17:03:16 -0700 |
| SCHEMA | <DB>.AGGREGATES_EULA | Thu, 15 Jun 2017 17:03:16 -0700 |
| TABLE | <DB>.AGGREGATES_EULA.AGGREGATE_1 | Thu, 15 Jun 2017 17:03:16 -0700 |
| VIEW | <DB>.AGGREGATES_EULA.AGGREGATE_1_v | Thu, 15 Jun 2017 17:03:16 -0700 |
+----------+------------------------------------+---------------------------------+
셰어는 aggregates_eula 스키마 하나와 aggregate_1 테이블 하나로 구성돼요. 데이터베이스 자신을 포함한 각 객체 이름이 <DB>로 접두사 처리돼 있는데, 이는 당신 계정에서 셰어로 아직 데이터베이스를 만들지 않았다는 뜻이에요.
셰어에서 데이터베이스 만들기
웹 인터페이스나 SQL로 셰어에서 데이터베이스를 만들 수 있어요.
웹 인터페이스:
- Snowsight에 로그인해요.
- 탐색 메뉴에서 Data sharing » External sharing을 선택해요.
- Shared with you 탭을 선택해요.
- Ready to Get 섹션에서 데이터베이스를 만들 셰어를 선택해요.
- 데이터베이스 이름과 접근이 허용된 역할을 설정해요.
- Get Data를 선택해요.
SQL — 데이터 공유 특화 문법으로 CREATE DATABASE 문을 실행해요:
CREATE DATABASE <name> FROM SHARE <provider_account>.<share_name>
여기서 provider_account는 셰어를 제공한 계정 이름이고, share_name은 데이터베이스를 만들 셰어의 이름이에요.
참고:
- 셰어는 계정당 한 번만 소비할 수 있어요.
- 데이터베이스를 만들기 전에 가져올 객체를 보려면
DESCRIBE SHARE명령을 사용해요.- 셰어에서 데이터베이스를 만들면 기본적으로 데이터베이스를 만든 역할만 데이터베이스 안 객체에 접근할 수 있어요. 다른 역할에 접근을 부여하는 방법은 아래 가져온 데이터베이스에 권한 부여하기를 참고해요.
SQL 예시
다음 예시는 sales_s 셰어에서 당신 계정에 snow_sales라는 새 데이터베이스를 만들어요.
CREATE DATABASE snow_sales FROM SHARE xy12345.sales_s;
새 snow_sales 데이터베이스를 나열해요:
SHOW DATABASES LIKE 'snow%';
+---------------------------------+-----------------------+------------+------------+-------------------------+--------------+---------+---------+----------------+
| created_on | name | is_default | is_current | origin | owner | comment | options | retention_time |
|---------------------------------+-----------------------+------------+------------+-------------------------+--------------+---------+---------+----------------|
| Sun, 10 Jul 2016 23:28:50 -0700 | SNOWFLAKE_SAMPLE_DATA | N | N | SFC_SAMPLES.SAMPLE_DATA | ACCOUNTADMIN | | | 1 |
| Thu, 15 Jun 2017 18:30:08 -0700 | SNOW_SALES | N | Y | xy12345.SALES_S | ACCOUNTADMIN | | | 1 |
+---------------------------------+-----------------------+------------+------------+-------------------------+--------------+---------+---------+----------------+
이 예시에서 origin 컬럼은 데이터베이스가 만들어진 셰어의 정규화된 이름을 나타내요. 마찬가지로 SHOW SHARES와 DESC SHARE 출력에는 셰어에서 만들어진 데이터베이스 이름이 포함돼요.
DESC SHARE xy12345.sales_s;
+----------+------------------------------------------+---------------------------------+
| kind | name | shared_on |
|----------+------------------------------------------+---------------------------------|
| DATABASE | SNOW_SALES | Thu, 15 Jun 2017 17:03:16 -0700 |
| SCHEMA | SNOW_SALES.AGGREGATES_EULA | Thu, 15 Jun 2017 17:03:16 -0700 |
| TABLE | SNOW_SALES.AGGREGATES_EULA.AGGREGATE_1 | Thu, 15 Jun 2017 17:03:16 -0700 |
| VIEW | SNOW_SALES.AGGREGATES_EULA.AGGREGATE_1_v | Thu, 15 Jun 2017 17:03:16 -0700 |
+----------+------------------------------------------+---------------------------------+
재공유(Resharing)하기
소비자는 재공유가 허용될 때, 프로바이더의 직접 셰어에서 가져온 데이터를 자신의 조직 안의 다른 Snowflake 계정과 재공유할 수 있어요. 조직 밖의 계정과는 직접 셰어를 재공유할 수 없어요.
재공유하기 전에 SHOW DATABASES를 실행해 가져온 데이터베이스의 resharing_settings 컬럼을 확인해요. 재공유가 허용될 때 resharing_settings에는 다음과 같은 JSON 객체가 들어 있어요.
{
"enabled": true,
"only_within_organization": true
}
재공유 워크플로
직접 셰어에서 데이터를 재공유하려면:
- 프로바이더의 직접 셰어에서 데이터베이스를 만든 뒤
SHOW DATABASES를 실행해resharing_settings컬럼이 재공유 허용을 표시하는지 확인해요. - 자신의 데이터베이스 안에 가져온 데이터를 참조하는 보안 뷰(secure view)를 만들어요. 가져온 데이터베이스의 객체는 셰어에 직접 연결할 수 없어요.
- 셰어를 만들고 보안 뷰에 대한
SELECT권한을 셰어에 부여한 뒤, 조직 안의 소비자 계정 하나 이상을 셰어에 추가해요.
다음 예시는 xy12345.sales_s 직접 셰어에서 snow_sales 데이터베이스를 가져오고, 데이터를 보안 뷰로 노출한 뒤, 그 뷰를 같은 조직의 yz23456 계정과 재공유해요.
-- 프로바이더의 직접 셰어에서 데이터베이스 만들기
CREATE DATABASE snow_sales FROM SHARE xy12345.sales_s;
-- 가져온 데이터베이스가 재공유에 활성화됐는지 확인
SHOW DATABASES LIKE 'snow_sales';
-- 자신의 데이터베이스 안에 가져온 데이터 위에 보안 뷰 만들기
CREATE DATABASE sales_reshare;
CREATE SCHEMA sales_reshare.aggregates;
CREATE SECURE VIEW sales_reshare.aggregates.aggregate_1_v AS
SELECT * FROM snow_sales.aggregates_eula.aggregate_1;
-- 셰어를 만들고, 보안 뷰에 접근 권한을 부여하고, 조직 안 소비자 계정 추가
CREATE SHARE sales_reshare_s;
GRANT USAGE ON DATABASE sales_reshare TO SHARE sales_reshare_s;
GRANT USAGE ON SCHEMA sales_reshare.aggregates TO SHARE sales_reshare_s;
GRANT SELECT ON VIEW sales_reshare.aggregates.aggregate_1_v TO SHARE sales_reshare_s;
ALTER SHARE sales_reshare_s ADD ACCOUNTS = yz23456;
재공유는 체인 안의 모든 계정이 재공유자와 같은 조직에 속하는 한 여러 계정(다중 레벨 재공유)으로 이어질 수 있어요.
직접 셰어 재공유에는 다음 제한이 있어요.
- 가져온 데이터베이스의 객체는 셰어에 직접 연결할 수 없어요. 가져온 데이터베이스 위에 보안 뷰를 만들고 그 뷰를 공유하는 대신 사용해요.
- 재공유는 자신의 조직 안 계정으로 제한돼요.
- 직접 셰어의 크로스 리전 재공유는 지원되지 않아요. 리전을 넘어 재공유하려면 listing을 사용해요.
- 접근할 수 있는 데이터를 재공유하려면, 재공유하는 뷰가 당신 계정에서 아웃바운드 셰어를 만드는 역할이 소유해야 해요. 프로바이더가 거버넌스 정책을 추가하고 뷰 소유자 역할과 셰어 소유자 역할이 다르면 "프로바이더에서 접근한 것이 곧 재공유되는 것"이 성립하지 않아요. 다른 역할에서 재공유된 뷰를 받았다면, 또 다른 아웃바운드 셰어를 만들기 전에 언제든 새로운 보안 뷰를 만들 수 있어요.
가져온 데이터베이스에 권한 부여하기
셰어 안 객체에 접근 권한을 부여하는 방법은 프로바이더가 데이터베이스 역할(database role)로 셰어 안 객체를 분할했는지에 따라 달라져요. 이 옵션은 셰어 안의 서로 다른 객체를 서로 다른 데이터베이스 역할과 연결해요. 단일 셰어에는 데이터베이스 역할로 접근 가능한 객체와 데이터베이스 역할과 연결되지 않은 객체가 함께 포함될 수 있다는 점을 기억해 두세요.
옵션 1: 셰어 안 객체가 데이터베이스 역할과 연결되지 않은 경우
가져온 데이터베이스에 대한 IMPORTED PRIVILEGES 권한을 계정 안의 하나 이상의 역할에 부여해 사용자가 셰어 안 객체에 접근하게 해줘요.
역할은 다음 중 하나에 해당할 때만 가져온 데이터베이스에 IMPORTED PRIVILEGES를 부여할 수 있어요.
- 가져온 데이터베이스를 소유함(즉 데이터베이스에 대한
OWNERSHIP권한 보유) MANAGE GRANTS전역 권한이 부여됨
다른 역할에 IMPORTED PRIVILEGES 지정하기
Snowsight 또는 SQL로 이 권한을 다른 역할에 지정할 수 있어요.
Snowsight:
- Catalog » Explorer를 선택해요.
- 권한을 부여하려는 데이터베이스를 선택해요.
- Privileges 섹션에서 + Privileges를 선택해요.
- 부여할 역할과 권한을 선택해요.
- Grant Privileges를 선택해요.
SQL — GRANT <privileges> … TO ROLE 문을 실행해요. 가져온 데이터베이스에 USAGE 권한이 있는 역할을 보려면 Snowsight 또는 SHOW GRANTS 명령을 사용해요.
SQL 예시:
-- 역할 r1이 셰어 xy12345.sales_s에서 데이터베이스 snow_sales를 만듦
use role r1;
create database snow_sales from share xy12345.sales_s;
-- 역할 r1이 데이터베이스 snow_sales의 IMPORTED PRIVILEGES를 역할 r2에 부여
grant imported privileges on database snow_sales to role r2;
r2는 데이터베이스에 대한 OWNERSHIP 권한이 없으므로, 다음 grant·revoke 연산 중 하나를 수행하려면 계정에 대한 MANAGE GRANTS 권한을 가져야 해요.
use role r2;
grant imported privileges on database snow_sales to role r3;
revoke imported privileges on database snow_sales from role r3;
옵션 2: 셰어 안 객체가 데이터베이스 역할과 연결된 경우
가져온 데이터베이스 안의 적절한 데이터베이스 역할을 계정 안의 하나 이상의 역할에 부여해 사용자가 셰어 안 객체에 접근하게 해줘요.
1단계: 셰어에서 데이터베이스 만들기
CREATE DATABASE … FROM SHARE로 셰어에서 데이터베이스를 만들어요. 이 명령을 실행하려면 전역 CREATE DATABASE와 IMPORT SHARE 권한이 있는 역할이 필요해요.
예를 들어 프로바이더 provider1과 셰어 share1에서 데이터베이스 c1을 만들어요.
CREATE DATABASE c1 FROM SHARE provider1.share1;
2단계: 데이터베이스 역할을 계정 수준 역할에 부여하기
셰어에서 데이터베이스를 만드는 데 사용한 역할을 사용해, 데이터베이스 역할을 계정 안의 역할에 부여해 그 역할을 가진 사용자가 셰어 안의 데이터베이스 객체에 접근하게 해줘요.
예를 들어 사용 가능한 데이터베이스 역할을 확인한 뒤 데이터베이스 역할 c1.r1을 계정 안의 analyst 역할에 부여해요.
SHOW DATABASE ROLES in DATABASE c1;
GRANT DATABASE ROLE c1.r1 TO ROLE analyst;
공유된 뷰나 테이블에 스트림 만들기
공유된 객체(보안 뷰나 테이블)에 스트림(stream)을 만들면 그 객체에서 이루어진 DML(데이터 조작 언어) 변경을 추적할 수 있어요. 이 기능은 "로컬" 객체(즉 스트림과 같은 계정 안의 객체)에 스트림을 만들고 사용하는 것과 비슷해요.
이 섹션의 SQL 문을 실행하는 역할은 공유된 테이블이나 보안 뷰에 필요한 권한이 있어야 해요.
공유된 뷰에 스트림 만들기:
CREATE STREAM <name> ON VIEW <shared_db>.<schema>.<view>;
예를 들어 snow_sales.aggregates_eula 데이터베이스·스키마 안의 공유된 aggregate_1_v 뷰에 스트림을 만들어요.
CREATE STREAM aggregate_1_v_stream ON VIEW snow_sales.aggregates_eula.aggregate_1_v;
공유된 테이블에 스트림 만들기:
CREATE STREAM <name> ON TABLE <shared_db>.<schema>.<table>;
예를 들어 공유된 aggregate_1 테이블에 테이블 스트림을 만들어요.
CREATE STREAM aggregate_1_stream ON TABLE snow_sales.aggregates_eula.aggregate_1;
참고:
- 데이터 프로바이더가 뷰나 테이블에서 변경 추적(change tracking)을 활성화해야 이 객체들에 스트림을 만들 수 있어요. 원하는 공유 객체에 스트림을 만들 수 없다면 데이터 프로바이더에게 변경 추적 활성화를 문의해요.
- 스트림이 오래되어(stale) 되는 것을 피하려면 테이블의 보존 기간 안에 트랜잭션으로 스트림 레코드를 소비해요. 테이블의 데이터 보존 기간을 확인하려면 데이터 프로바이더에게 문의해요. 스트림이 오래됐는지 확인하려면
DESCRIBE STREAM또는SHOW STREAMS명령을 실행해요. 출력에서STALE컬럼 값이TRUE면 스트림이 오래되었을 수 있어요. 실제로는 기대한STALE_AFTER이후에도 스트림 읽기가 잠시 성공할 수 있지만, 이 기간 중 언제든 스트림이 오래될 수 있어요.
가져온 데이터베이스 쿼리하기
가져온 데이터베이스를 쿼리하는 것은 계정 안의 다른 데이터베이스를 쿼리하는 것과 같아요. 예:
USE ROLE r1;
USE DATABASE snow_sales;
SELECT * FROM aggregates_1;