공유 데이터 소비하기

이 항목에서는 데이터 공급자가 제공하여 사용할 수 있는 공유에서 데이터베이스를 생성한 후 쿼리 및 기타 작업에서 데이터베이스를 사용하는 것과 관련된 작업에 대한 설명을 제공합니다.

이러한 태스크를 수행하려면 ACCOUNTADMIN 역할(또는 IMPORT SHARE 전역 권한이 부여된 역할)을 사용해야 합니다. IMPORT SHARE 권한에 대한 자세한 내용은 ACCOUNTADMIN 외 역할을 사용하여 데이터 공유 작업 수행하기 를 참조하십시오.

참고

이 항목에서 설명되는 태스크는 독자 계정에는 해당하지 않습니다. 독자 계정을 사용하여 공유 데이터를 사용하는 경우에는 공급자 계정의 관리자가 이러한 태스크를 이미 완료했으므로 수행할 필요가 없습니다.

이 항목의 내용:

공유 데이터베이스에 대한 일반 제한 사항

공유 데이터베이스에서 컨슈머에 대한 제한 사항은 다음과 같습니다.

  • 공유 데이터베이스는 읽기 전용입니다. 컨슈머 계정의 사용자는 데이터를 살펴보거나 쿼리할 수 있지만, 데이터를 삽입 또는 업데이트하거나 데이터베이스에 오브젝트를 생성할 수 없습니다.

  • 지원되지 않는 작업은 다음과 같습니다.

    • 공유 데이터베이스 또는 데이터베이스의 모든 스키마/테이블의 복제본 생성.

    • 공유 데이터베이스 또는 데이터베이스의 모든 스키마/테이블에 대한 Time Travel.

    • 공유 데이터베이스에 대한 설명 편집.

  • 공유 데이터베이스 및 데이터베이스의 모든 오브젝트는 다른 계정과 다시 공유할 수 없습니다.

  • 공유 데이터베이스는 복제할 수 없습니다.

사용할 수 있는 공유 보기

웹 인터페이스 또는 SQL을 사용하여 계정에서 사용할 수 있는 공유를 살펴볼 수 있습니다.

Snowsight

Data » Private Sharing 을 선택한 다음 Shared With You 를 선택합니다. 다음을 볼 수 있습니다.

  • 자신과 공유된 비공개 공유 목록. 액세스할 수 있는 데이터 교환 목록을 확인할 수도 있습니다.

  • 사용자와 공유된 직접 공유. 공유 상태에 따라 공유는 다음의 두 섹션으로 그룹화됩니다.

    • 가져올 수 있는 직접 공유(예: 데이터베이스가 공유에서 생성되지 않음).

    • 데이터베이스로 가져와 쿼리할 수 있는 직접 공유.

데이터베이스로 가져와서 쿼리할 준비가 된 Snowflake Marketplace 목록을 보려면 탐색 메뉴에서 Marketplace 로 이동하십시오. 자세한 내용은 목록 탐색하기 를 참조하십시오.

Classic Console

Shares Shares tab 를 선택한 다음 Inbound 토글을 선택합니다.

계정에서 사용할 수 있는 모든 공유가 페이지에 표시됩니다. Database 열에는 공유에서 생성된 데이터베이스의 이름이 표시됩니다. 이 열이 비어 있으면 공유에서 데이터베이스가 아직 (사용자의 계정에) 생성되지 않은 것입니다.

SQL

SHOW SHARES 또는 DESCRIBE SHARE 문을 실행합니다.

예를 들어 SQL을 사용하는 경우는 다음과 같습니다.

SHOW SHARES;
Copy

출력은 다음과 같습니다.

  • 2개의 공유, 즉 sales_ssales_s2 를 사용할 수 있습니다. kind 열의 INBOUND 는 데이터 공급자가 사용자 계정에서 공유를 사용할 수 있도록 설정했음을 지정합니다.

  • name 열에는 각 공유의 이름이 share_name (예: SALE_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 명령을 사용하여 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 |
+----------+------------------------------------+---------------------------------+
Copy

이 공유는 aggregates_eula 스키마 1개 및 aggregate_1 테이블 1개로 구성됩니다. 데이터베이스 자체를 포함하여 각 오브젝트 이름에는 <DB> 가 접두사로 사용되었습니다. 이는 공유에서 아직 (사용자의 계정에) 데이터베이스가 생성되지 않았음을 나타냅니다.

공유에서 데이터베이스 만들기

웹 인터페이스 또는 SQL을 사용하여 공유에서 데이터베이스를 생성할 수 있습니다.

Snowsight
  1. Snowsight 에 로그인합니다.

  2. Data » Private Sharing 를 선택합니다.

  3. Shared with You 탭을 선택합니다.

  4. Ready to Get 섹션에서 데이터베이스를 만들려는 공유를 선택합니다.

  5. 데이터베이스 이름과 데이터베이스에 액세스할 수 있는 역할을 설정합니다.

  6. Get Data 를 선택합니다.

Classic Console
  1. Shares Shares tab 를 선택한 다음 Inbound 토글을 선택합니다.

  2. 아직 데이터베이스가 생성되지 않은 공유(즉, Database 열이 비어 있음)를 선택합니다.

  3. Create Database from Share 를 선택합니다.

  4. 대화 상자에서 제공되는 메시지를 따라 진행합니다.

SQL

다음과 같은 데이터 공유별 구문을 사용하여 CREATE DATABASE 문을 실행합니다.

CREATE DATABASE <name> FROM SHARE <provider_account>.<share_name>
Copy

여기서 provider_account 는 공유를 제공한 계정의 이름이고 share_name 은 데이터베이스를 생성할 공유의 이름입니다.

참고

  • 공유는 계정당 한 번만 사용할 수 있습니다.

  • 데이터베이스를 생성하기 전 공유 중인 오브젝트를 확인하려면 DESCRIBE SHARE 명령을 사용합니다.

  • 공유에서 데이터베이스가 생성되면 기본적으로 데이터베이스 생성에 사용되는 역할만 데이터베이스의 오브젝트에 액세스할 수 있습니다. 다른 역할에 대한 액세스 권한 부여에 대한 지침은 이 항목의 공유 데이터베이스에 권한 부여하기 를 참조하십시오.

SQL 예

다음 예에서는 sales_s 공유에서 이름이 snow_sales 인 새 데이터베이스를 계정에 생성합니다.

CREATE DATABASE snow_sales FROM SHARE xy12345.sales_s;
Copy

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

이 예에서 origin 열은 데이터베이스가 생성된 공유의 정규화된 이름을 나타냅니다.

유사하게, SHOW SHARES 및 DESC SHARE의 출력에는 공유에서 생성된 데이터베이스의 이름이 포함됩니다.

SHOW SHARES;
Copy
+-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+
| 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 |                                        |                     |
+-------------------------------+----------+----------------------+---------------+-----------------------+------------------+--------------+----------------------------------------+---------------------+
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 |
+----------+------------------------------------------+---------------------------------+
Copy

공유 데이터베이스에 권한 부여하기

공유의 오브젝트에 대한 액세스 권한을 부여하는 지침은 공급자가 데이터베이스 역할을 사용하여 공유의 오브젝트를 분할했는지 여부에 따라 다릅니다. 이 옵션은 공유의 다른 오브젝트를 다른 데이터베이스 역할과 연결합니다.

단일 공유는 데이터베이스 역할을 통해 액세스할 수 있는 오브젝트와 데이터베이스 역할과 연결되지 않은 오브젝트를 모두 포함할 수 있습니다.

옵션 1: 데이터베이스 역할과 연결되지 않은 공유의 오브젝트

계정에 있는 하나 이상의 역할에 공유 데이터베이스에 대한 IMPORTED PRIVILEGES 권한을 부여하여 사용자가 공유에 있는 오브젝트에 액세스할 수 있도록 허용합니다.

다음 중 한 가지를 충족하는 역할만 가져온 데이터베이스에 대한 IMPORTED PRIVILEGES를 부여할 수 있습니다.

  • 가져온 데이터베이스를 소유하고 있는 역할(이 데이터베이스에 대해 OWNERSHIP 권한이 있음).

  • MANAGE GRANTS 전역 권한을 부여 받은 역할.

다른 역할에 IMPORTED PRIVILEGES 할당하기

이 역할은 웹 인터페이스 또는 SQL을 사용하여 다른 역할에 할당할 수 있습니다.

Classic Console

Databases Databases tab » <공유_db_이름> 을 클릭합니다.

측면 패널에서 Grant Privileges 를 클릭하고 1개 이상의 역할에 권한을 부여합니다.

SQL

GRANT <권한> 문을 실행합니다.

공유 데이터베이스에 대한 USAGE 권한이 있는 역할을 확인하려면 웹 인터페이스 또는 SHOW GRANTS 명령을 사용합니다.

SQL 예

  1. r1 역할은 xy12345.sales_s 공유에서 snow_sales 데이터베이스를 생성합니다.

    use role r1;
    create database snow_sales from share xy12345.sales_s;
    
    Copy
  2. r1 역할은 r2 역할에 snow_sales 데이터베이스에 대한 IMPORTED PRIVILEGES를 부여합니다.

    grant imported privileges on database snow_sales to role r2;
    
    Copy
  3. r2 는 데이터베이스에 대한 OWNERSHIP 권한이 없으므로 다음과 같은 권한 부여 또는 취소 작업을 수행하려면 r2 역할에 계정에 대한 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;
    
    Copy

옵션 2: 데이터베이스 역할과 연결된 공유의 오브젝트

계정에 있는 하나 이상의 역할에 공유 데이터베이스의 알맞은 데이터베이스 역할을 부여하여 사용자가 공유에 있는 오브젝트에 액세스할 수 있도록 허용합니다.

1단계: 공유에서 데이터베이스 생성

CREATE DATABASE … FROM SHARE 를 사용하여 공유에서 데이터베이스를 생성합니다.

이 명령을 실행하려면 전역 CREATE DATABASE 및 IMPORT SHARE 권한이 있는 역할이 필요합니다.

예를 들어 공급자 provider1 및 공유 share1 에서 데이터베이스 c1 을 생성합니다.

CREATE DATABASE c1 FROM SHARE provider1.share1;
Copy

2단계: 계정 수준 역할에 공유 데이터베이스 역할 부여

계정의 역할에 공유 데이터베이스 역할을 부여하여 해당 역할을 가진 사용자가 공유의 데이터베이스 오브젝트에 액세스할 수 있도록 허용합니다.

공유에서 데이터베이스를 생성하는 데 사용한 역할을 사용합니다.

예를 들어 사용 가능한 데이터베이스 역할을 확인한 다음, 계정의 analyst 역할에 데이터베이스 역할 c1.r1 을 부여합니다.

SHOW DATABASE ROLES in DATABASE c1;
GRANT DATABASE ROLE c1.r1 TO ROLE analyst;
Copy

공유 뷰 또는 테이블에 스트림 만들기

공유 오브젝트(보안 뷰 또는 테이블)에서 스트림을 생성하면 사용자가 해당 오브젝트에서 수행된 데이터 조작 언어(DML) 변경 사항을 추적할 수 있습니다. 이 기능은 《로컬》 오브젝트(즉, 스트림과 동일한 계정)에서 스트림을 생성 및 사용하는 기능과 유사합니다.

이 섹션에서 SQL 문을 실행하는 데 사용되는 역할은 공유 테이블 또는 보안 뷰에 대한 필수 권한을 부여받아야 합니다. 자세한 내용은 이 항목의 공유 데이터베이스에 권한 부여하기 섹션을 참조하십시오.

  • 공유 뷰에서 스트림을 만드는 방법은 다음과 같습니다.

    CREATE STREAM <name> ON VIEW <shared_db>.<schema>.<view>;
    
    Copy

    예를 들어, snow_sales.aggregates_eula 데이터베이스 및 스키마의 공유 aggregate_1_v 뷰에 스트림을 생성합니다.

    CREATE STREAM aggregate_1_v_stream ON VIEW snow_sales.aggregates_eula.aggregate_1_v;
    
    Copy
  • 공유 테이블에서 스트림을 만드는 방법은 다음과 같습니다.

    CREATE STREAM <name> ON TABLE <shared_db>.<schema>.<table>;
    
    Copy

    예를 들어, snow_sales.aggregates_eula 데이터베이스 및 스키마의 공유 aggregate_1 테이블에 테이블 스트림을 생성합니다.

    CREATE STREAM aggregate_1_stream ON TABLE snow_sales.aggregates_eula.aggregate_1;
    
    Copy

스트림 생성과 관련한 자세한 내용은 CREATE STREAM 를 참조하십시오.

참고

  • 데이터 공급자는 뷰나 테이블에 대한 변경 내용 추적을 활성화해야 이러한 오브젝트에 스트림을 생성할 수 있습니다. 원하는 공유 개체에서 스트림을 생성할 수 없는 경우 데이터 공급자에게 문의하여 오브젝트에 대한 변경 내용 추적을 활성화해 보십시오.

  • 스트림이 부실해지는 것을 방지하려면 테이블의 보존 기간 중에 트랜잭션 내에서 스트림 기록을 사용해야 합니다. 테이블의 데이터 보존 기간을 확인하려면 데이터 공급자에게 문의하십시오.

    스트림이 부실해졌는지 여부를 판단하려면 DESCRIBE STREAM 또는 SHOW STREAMS 명령을 실행하십시오. 명령의 출력에서 STALE 열의 값이 TRUE이면 스트림이 부실해질 수 있습니다. 실제로는 예상되는 STALE_AFTER 이후의 일정 시간 동안에도 스트림을 읽을 수 있습니다. 그러나 이 시간 동안에는 언제라도 스트림이 부실해질 수 있습니다.

공유 데이터베이스 쿼리하기

공유 데이터베이스를 쿼리하는 방법은 계정의 다른 데이터베이스를 쿼리하는 방법과 동일합니다.

예:

USE ROLE r1;

USE DATABASE snow_sales;

SELECT * FROM aggregates_1;
Copy