Secure Data Sharing 시작하기

Secure Data Sharing은 매우 강력하고 편리하게 사용할 수 있는 기능입니다. 단 몇 단계를 통해 데이터 공급자로 시작할 수 있습니다.

이 항목에서는 공유를 생성하여 데이터베이스 및 해당 오브젝트를 1개 이상의 계정과 공유하기 위해 필요한 작업을 소개합니다. 직접 공유 또는 목록을 사용하여 컨슈머에게 공유를 제공할 수 있습니다.

목록에 공유를 연결하거나 활성 컨슈머와의 직접 공유를 목록으로 전환할 수 있습니다. 지침은 직접 공유를 목록으로 전환하기 를 참조하십시오.

이 항목의 내용:

데이터베이스 오브젝트 공유 방법 선택하기

계속하기 전에 공유에 오브젝트를 추가하기 위한 다음 중 요구 사항에 가장 부합하는 옵션을 결정하십시오.

  • 옵션 1. 공유에 데이터베이스 역할 부여:

    공유에 대해 데이터베이스에 여러 데이터베이스 역할을 만들어 공유의 보안 오브젝트를 분할합니다. 데이터베이스의 오브젝트 하위 세트에 대한 권한을 각 데이터베이스 역할에 부여합니다. 그런 다음 각 데이터베이스 역할을 공유에 부여합니다.

    데이터베이스 역할을 포함하는 공유에서 데이터베이스를 만든 후, 데이터 컨슈머는 공유된 각 데이터베이스 역할을 자신의 계정에 있는 하나 이상의 계정 역할 에 부여합니다.

    데이터 컨슈머 계정에서 데이터베이스 역할이 없는 계정 관리자가 사용자로 하여금 공유의 모든 데이터베이스와 데이터베이스 오브젝트(테이블, 보안 뷰 등)에 액세스할 수 있도록 단일 권한 IMPORTED PRIVILEGES를 역할에 부여합니다. 데이터 컨슈머 계정의 다양한 사용자 그룹이 공유 오브젝트의 하위 세트에 액세스하도록 허용하는 옵션은 없습니다. 이러한 양자택일 접근 방식에서는 동일한 데이터베이스의 서로 다른 오브젝트에 대한 액세스 권한을 부여하기 위해 여러 공유를 생성해야 합니다.

    참고

    단일 공유에 여러 데이터베이스의 데이터를 포함하려는 경우 데이터베이스 역할에 REFERENCE_USAGE 권한을 부여할 수 없으므로 이 옵션을 사용할 수 없습니다. 여러 데이터베이스의 데이터를 공유하는 지침은 여러 데이터베이스에서 데이터 공유하기 섹션을 참조하십시오.

    또는 공유에 데이터베이스 역할을 부여하는 공유를 만들 수 있지만(옵션 1), 그러한 오브젝트에 대한 권한을 데이터베이스 역할에 부여하지 않고 같은 공유에 오브젝트에 대한 권한을 직접 부여할 수도 있습니다(옵션 2). 공유에서 데이터베이스를 생성하는 데이터 컨슈머는 로컬 역할에 데이터베이스에 대한 IMPORTED PRIVILEGES 권한을 부여하여 공유에 직접 부여된 오브젝트에 액세스할 수 있습니다.

    공유 데이터베이스 역할은 오브젝트에 대한 향후 권한 부여를 지원하지 않습니다. 자세한 내용은 GRANT DATABASE ROLE … TO SHARE 섹션을 참조하십시오.

  • 옵션 2. 오브젝트에 대한 권한을 공유에 직접 부여:

    데이터베이스의 특정 오브젝트에 대한 권한을 공유에 직접 부여합니다. 이 옵션을 사용하면 이러한 데이터베이스가 같은 계정에 속해 있는 한, 공유에 있는 여러 데이터베이스의 데이터를 포함할 수 있습니다. 여러 데이터베이스의 데이터를 공유하는 지침은 여러 데이터베이스에서 데이터 공유하기 섹션을 참조하십시오.

    데이터 컨슈머 계정의 계정 관리자는 해당 사용자가 공유에 있는 데이터베이스와 데이터베이스 오브젝트(테이블, 보안 뷰 등)에 액세스할 수 있도록 공유 데이터베이스에 대한 IMPORTED PRIVILEGES 권한을 하나 이상의 역할에 부여합니다.

    이 옵션은 역할을 기반으로 공유에서 데이터베이스 오브젝트 분할을 지원하지 않습니다. 이 제어 수준에 대해서는 옵션 1을 참조하십시오.

옵션 1: 공유에 데이터베이스 역할 부여

이 섹션에서는 데이터 공급자가 데이터베이스 역할을 사용하여 공유에 있는 데이터베이스와 데이터베이스 오브젝트에 대한 액세스를 제한하는 지침을 제공합니다.

참고

이 항목에서 설명하는 작업을 수행하려면 자신의 역할에 전역 CREATE DATABASE 권한과 CREATE SHARE 권한이 있어야 합니다.

이 섹션에서 설명하며 확장한 예에서 데이터 공급자는 다음 오브젝트를 데이터 컨슈머와 공유합니다.

데이터베이스

d1

스키마

d1.s1

보안 뷰

d1.s1.v1

이 뷰의 결과 세트는 d1.s1.t1 테이블의 레코드를 포함합니다.

d1.s1.v2

이 뷰의 결과 세트는 d1.s1.t2d1.s1.t3 테이블의 레코드를 포함합니다.

데이터 공급자는 d1.r1d1.r2 오브젝트에 대한 액세스를 제어하기 위해 데이터베이스 d1 에 두 개의 데이터베이스 역할을 생성합니다.

다음 다이어그램은 이러한 오브젝트 간의 관계를 보여주고 데이터베이스 역할에 부여해야 하는 권한을 나타냅니다.

데이터베이스 역할과의 데이터 공유 예

권한에 대한 자세한 내용은 액세스 제어 권한 섹션을 참조하십시오.

1단계: 데이터베이스 역할 만들기

CREATE DATABASE ROLE 을 사용하여 새 데이터베이스 역할을 만들거나 기존 데이터베이스 역할을 대체합니다.

예를 들어 정규화된 식별자를 사용하여 d1.r1d1.r2 데이터베이스 역할을 만듭니다.

CREATE DATABASE ROLE d1.r1;

CREATE DATABASE ROLE d1.r2;
Copy

또는 세션에서 원하는 데이터베이스를 현재 데이터베이스로 설정한 다음, 데이터베이스 역할을 만듭니다.

USE DATABASE d1;

CREATE DATABASE ROLE r1;

CREATE DATABASE ROLE r2;
Copy

2단계: 데이터베이스 역할에 오브젝트에 대한 권한 부여

GRANT <권한> 를 사용하여 단일 데이터베이스와 그 데이터베이스의 오브젝트 하위 세트에 대한 권한을 각 데이터베이스 역할에 부여합니다. 데이터베이스 역할이 액세스를 허용해야 하는 오브젝트에 대한 권한만 부여합니다.

데이터베이스 역할의 정규화된 이름을 지정하거나 세션에서 데이터베이스를 활성 데이터베이스로 설정한 다음, 상대적 이름을 지정합니다.

참고

  • 이 항목에서 설명하는 작업을 수행하려면 ACCOUNTADMIN 역할 또는 관련 권한이 부여된 역할 을 사용해야 합니다. 추가적인 데이터 공유 시나리오를 포함한 자세한 내용은 공유 관련 작업하기 섹션을 참조하십시오.

  • 데이터베이스 역할에 부여된 권한은 데이터베이스 역할과 동일한 데이터베이스의 다른 오브젝트에 대한 권한을 포함하는 데이터베이스와 스키마에 대한 USAGE로 제한됩니다. 특히, 여러 데이터베이스의 오브젝트를 공유에 포함하도록 데이터베이스 역할에 REFERENCE_USAGE 권한을 부여할 수 없습니다.

이러한 지침에서 확장된 예를 계속하면 다음 권한이 데이터베이스 역할에 부여됩니다.

데이터베이스 역할

권한

오브젝트

d1.r1

USAGE

데이터베이스 d1

USAGE

스키마 d1.s1

SELECT

보안 뷰 d1.s1.v1

d1.r2

USAGE

데이터베이스 d1

USAGE

스키마 d1.s1

SELECT

보안 뷰 d1.s1.v2

다음 SQL 문을 실행하면 d1.r1 데이터베이스 역할에 권한이 부여됩니다.

GRANT USAGE ON SCHEMA d1.s1 TO DATABASE ROLE d1.r1;
GRANT SELECT ON VIEW d1.s1.v1 TO DATABASE ROLE d1.r1;
Copy

다음 SQL 문을 실행하면 d1.r2 데이터베이스 역할에 권한이 부여됩니다.

GRANT USAGE ON SCHEMA d1.s1 TO DATABASE ROLE d1.r2;
GRANT SELECT ON VIEW d1.s1.v2 TO DATABASE ROLE d1.r2;
Copy

상위 데이터베이스에 USAGE 권한을 부여할 필요는 없습니다. 이 권한은 데이터베이스 역할이 생성될 때 암시적으로 부여됩니다.

데이터베이스 역할에 부여된 모든 권한을 보려면 정규화된 식별자를 사용하여 SHOW GRANTS TO DATABASE ROLE을 실행하십시오.

SHOW GRANTS TO DATABASE ROLE d1.r1;
SHOW GRANTS TO DATABASE ROLE d1.r2;
Copy

또는 세션에서 원하는 데이터베이스를 현재 데이터베이스로 설정한 다음, 아래 명령을 실행합니다.

USE DATABASE d1;

SHOW GRANTS TO DATABASE ROLE r1;
SHOW GRANTS TO DATABASE ROLE r2;
Copy

3단계: 공유 만들기

CREATE SHARE 를 사용하여 공유 만들기 공유는 프로세스의 이 단계에서 빈 컨테이너입니다.

예를 들어 share1 이라는 새 공유를 만듭니다.

CREATE SHARE share1;
Copy

4단계: 공유에 USAGE 권한을 부여하여 데이터베이스 추가

현재, 데이터베이스를 공유에 포함하려면 데이터베이스에 대한 USAGE 권한을 부여해야 합니다.

예를 들어 공유 share1d1 데이터베이스에 대한 USAGE 권한을 부여합니다.

GRANT USAGE ON DATABASE d1 TO SHARE share1;
Copy

5단계: 데이터베이스 역할을 공유에 부여하여 오브젝트 추가

GRANT DATABASE ROLE … TO SHARE 를 사용하여 공유에 데이터베이스 역할을 부여하여 공유에 데이터베이스와 데이터베이스 오브젝트를 추가합니다.

예를 들어 공유 share1d1.r1d1.r2 데이터베이스 역할을 부여합니다.

GRANT DATABASE ROLE d1.r1 TO SHARE share1;
GRANT DATABASE ROLE d1.r2 TO SHARE share1;
Copy

6단계: 하나 이상의 데이터 컨슈머 계정과 데이터베이스 오브젝트 공유

공유 ALTER SHARE … ADD ACCOUNTS 를 수정하고 데이터베이스 오브젝트를 공유하려는 데이터베이스 컨슈머 계정을 추가합니다.

다음 예에서는 조직 org1consumer1consumer2 계정을 공유 share1 에 추가합니다.

ALTER SHARE share1 ADD ACCOUNTS = org1.consumer1,org1.consumer2;
Copy

데이터베이스 역할 관리하기

이 섹션에서는 공유에 부여된 데이터베이스 역할을 관리하는 지침을 제공합니다.

데이터 공급자: 공유 데이터베이스 역할 이름 바꾸기

ALTER DATABASE ROLE … RENAME TO 문을 사용하여 데이터베이스 역할의 이름을 바꿉니다.

예를 들어 데이터베이스 역할 d1.r1 의 이름을 d1.r3 으로 바꿉니다.

ALTER DATABASE ROLE d1.r1 RENAME TO d1.r3;
Copy

d1.r1 에 부여된 모든 권한은 데이터베이스 역할의 이름이 바뀐 후에도 유지됩니다.

데이터베이스 역할의 이름이 변경되었음을 공유의 모든 데이터 컨슈머에게 알립니다.

RENAME TO 절을 사용하여 데이터베이스 역할을 다른 데이터베이스로 이동하는 것은 금지됩니다. 예:

ALTER DATABASE ROLE d1.r1 RENAME TO d2.r1;
Copy

데이터 공급자: 공유 데이터베이스 역할 삭제하기

DROP DATABASE ROLE을 사용하여 데이터베이스 역할을 삭제합니다.

예를 들어 데이터베이스 역할 d1.r2 를 삭제합니다.

DROP DATABASE ROLE d1.r2;
Copy

데이터베이스 역할을 포함하는 공유의 모든 데이터 컨슈머에게 알립니다. 데이터베이스 역할에 부여된 모든 오브젝트에 대한 액세스가 취소됩니다.

데이터 공급자: 새 공유 데이터베이스 역할 생성

CREATE DATABASE ROLE을 사용하여 새 데이터베이스 역할을 만듭니다. 자세한 내용은 이 항목의 1단계: 데이터베이스 역할 만들기 섹션을 참조하십시오. 데이터베이스 역할에 데이터베이스 오브젝트에 대한 권한을 부여한 다음, 공유에 데이터베이스 역할을 부여합니다.

새 데이터베이스 역할을 포함하는 공유의 모든 데이터 컨슈머에게 알립니다. 데이터 컨슈머는 그와 같은 역할이 데이터베이스 역할과 연결된 오브젝트에 액세스할 수 있도록 자신의 계정 역할에 새 데이터베이스 역할을 부여해야 합니다.

옵션 2: 공유에 직접 권한 부여

이 섹션에서는 컨슈머가 공유 데이터베이스에 대한 단일 권한을 부여하여 공유에 있는 모든 데이터베이스와 데이터베이스 오브젝트에 액세스할 수 있도록 데이터 공급자를 위한 지침을 제공합니다.

1단계: 공유 만들기

CREATE SHARE 를 사용하여 공유를 생성합니다. 이 단계에서 공유는 단순히 오브젝트 및 계정의 추가를 대기하는 컨테이너입니다.

2단계: 권한을 부여하여 공유에 오브젝트 추가

GRANT <권한> … TO SHARE 를 사용하여 공유에 다음 오브젝트 권한을 부여합니다.

  • 공유할 데이터베이스에 대한 USAGE 권한.

  • 공유할 오브젝트가 포함된 각 데이터베이스 스키마에 대한 USAGE 권한.

  • 각 공유 스키마에서 특정 오브젝트를 공유하기 위한 SELECT 권한:

    • 테이블

    • 외부 테이블

    • 보안 뷰

    • 보안 구체화된 뷰

    • 보안 UDFs

중요

다른 리전 또는 클라우드 플랫폼 에서 데이터 컨슈머와 데이터를 안전하게 공유하려는 경우, 데이터베이스에 외부 테이블이 하나 이상 있으면 기본 데이터베이스를 복제할 수 없음에 유의해야 합니다.

참고

스트림에 대한 보안 뷰를 만든 다음 해당 뷰를 컨슈머와 공유하는 것은 권장하지 않습니다. 대신, 컨슈머가 테이블에 자신의 스트림을 만들고 공유하는 뷰를 보호할 수 있도록 허용합니다. 자세한 내용은 공유 오브젝트의 스트림 섹션을 참조하십시오.

선택 사항으로 SHOW GRANTS 를 사용하여 공유에 대한 오브젝트 권한을 확인할 수 있습니다.

다음 단계를 완료하면 공유에 추가되는 모든 계정에 공유가 표시되므로 이 시점에서 공유에 대해 이 최소한의 유효성 검사를 수행합니다.

공유에 대해 더욱 심층적인 유효성 검사를 수행하려면 계정에서 컨슈머 계정을 시뮬레이션하면 됩니다. 자세한 내용은 보안 오브젝트를 사용하여 데이터 액세스 제어하기 섹션을 참조하십시오.

3단계: 공유에 1개 이상의 계정 추가

ALTER SHARE 를 사용하여 공유에 1개 이상의 계정을 추가합니다. 공유에 추가된 계정을 확인하려면 SHOW GRANTS 를 사용합니다.

이제 지정된 계정에서 공유를 사용할 수 있습니다. 이러한 데이터 공급자 작업과 다른 데이터 공급자 작업의 수행을 위한 자세한 지침은 공유 관련 작업하기 섹션을 참조하십시오.

다음 예에서는 위에서 설명한 전체 공급자 프로세스를 보여줍니다.

이 예에서 가정한 사항은 다음과 같습니다.

  • 이름이 aggregates_eula 인 스키마와 이름이 aggregate_1 인 테이블이 포함된 이름이 sales_db 인 데이터베이스.

  • 데이터베이스, 스키마 및 테이블은 이름이 xy12345yz23456 인 계정 2개와 공유됩니다.

USE ROLE accountadmin;

CREATE SHARE sales_s;

GRANT USAGE ON DATABASE sales_db TO SHARE sales_s;
GRANT USAGE ON SCHEMA sales_db.aggregates_eula TO SHARE sales_s;
GRANT SELECT ON TABLE sales_db.aggregates_eula.aggregate_1 TO SHARE sales_s;

SHOW GRANTS TO SHARE sales_s;

ALTER SHARE sales_s ADD ACCOUNTS=xy12345, yz23456;

SHOW GRANTS OF SHARE sales_s;
Copy