

 Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)을 참조하세요.

# Amazon Redshift에서 데이터 공유에 대한 권한 관리
<a name="writes-managing-permissions"></a>

생산자 관리자는 공유 중인 데이터세트에 대한 제어 권한을 보유합니다. 따라서 datashare에서 새 객체를 추가하거나 제거할 수 있습니다. 소비자 클러스터 및 AWS 계정 또는 AWS 리전에 대해 전체적으로 datashare에 대한 액세스 권한을 부여하거나 취소할 수도 있습니다. 권한이 취소되면 소비자 클러스터는 즉시 공유 객체에 대한 액세스 권한을 상실하고 SVV\$1DATASHARES의 INBOUND datashare 목록에서 해당 객체를 볼 수 없습니다.

다음 예제에서는 `salesshare` 데이터 공유를 만들고, `public` 스키마를 추가하고, `public.tickit_sales_redshift` 테이블을 `salesshare`에 추가합니다. 또한 특정 네임스페이스에 `salesshare`에 대한 사용 권한을 부여합니다.

```
CREATE DATASHARE salesshare;
            
ALTER DATASHARE salesshare ADD SCHEMA public;

ALTER DATASHARE salesshare ADD TABLE public.tickit_sales_redshift; 

GRANT USAGE ON DATASHARE salesshare TO NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

CREATE DATASHARE의 경우 슈퍼 사용자와 데이터베이스 소유자는 datashare를 생성할 수 있습니다. 자세한 내용은 [CREATE DATASHARE](r_CREATE_DATASHARE.md) 섹션을 참조하세요. ALTER DATASHARE의 경우 추가하거나 제거할 datashare 객체에 대한 필수 권한이 있는 datashare 소유자는 datashare를 변경할 수 있습니다. 자세한 내용은 [ALTER DATASHARE](r_ALTER_DATASHARE.md) 섹션을 참조하세요.

생산자 관리자가 삭제한 datashare는 소비자 클러스터에 더 이상 나열되지 않습니다. 삭제된 datashare에서 소비자 클러스터에 생성된 데이터베이스 및 스키마 참조는 객체 없이 계속 존재합니다. 소비자 관리자는 수동으로 이러한 데이터베이스를 삭제해야 합니다.

소비자 측에서 소비자 관리자는 데이터 공유에서 데이터베이스를 만들어 공유 데이터에 액세스해야 하는 사용자와 역할을 결정할 수 있습니다. 데이터베이스를 생성할 때 선택한 옵션에 따라 다음과 같이 데이터베이스 액세스를 제어할 수 있습니다. 데이터 공유에서 데이터베이스 생성에 대한 자세한 내용은 [데이터베이스 생성](r_CREATE_DATABASE.md) 섹션을 참조하세요.

데이터 공유 설정 및 소비자의 데이터 읽기에 대한 자세한 내용은 [AWS 계정 내 데이터에 대한 읽기 액세스 공유](https://docs.aws.amazon.com/redshift/latest/dg/within-account.html)를 참조하세요.

**WITH PERMISSIONS 절을 사용하지 않고 데이터베이스 생성**  
관리자는 데이터베이스 또는 스키마 수준에서 액세스를 제어할 수 있습니다. 스키마 수준에서 액세스를 제어하려면 관리자는 데이터 공유에서 생성된 Amazon Redshift 데이터베이스에서 외부 스키마를 생성해야 합니다.

다음 예에서는 데이터베이스 수준 및 스키마 수준에서 공유 테이블에 액세스할 수 있는 권한을 부여합니다.

```
GRANT USAGE ON DATABASE sales_db TO Bob;

CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE sales_db SCHEMA 'public';

GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
```

액세스를 추가로 제한하려면 공유 객체 위에 뷰를 생성하여 필요한 데이터만 표시할 수 있습니다. 그런 다음 이러한 뷰를 사용하여 사용자와 역할에 대한 액세스 권한을 부여할 수 있습니다.

사용자에게 데이터베이스 또는 스키마에 대한 액세스 권한이 부여된 후 해당 데이터베이스 또는 스키마의 모든 공유 객체에 액세스할 수 있습니다.

**WITH PERMISSIONS 절을 사용하여 데이터베이스 생성**  
데이터베이스 또는 스키마에 대한 사용 권한을 부여한 후 관리자는 로컬 데이터베이스 또는 스키마에서와 동일한 권한 부여 프로세스를 사용하여 액세스를 추가로 제어할 수 있습니다. 개별 객체 권한이 없으면 사용자는 USAGE 권한을 부여받은 후에도 데이터 공유 데이터베이스 또는 스키마의 객체에 액세스할 수 없습니다.

다음 예에서는 데이터베이스 수준에서 공유 테이블에 액세스할 수 있는 권한을 부여합니다.

```
GRANT USAGE ON DATABASE sales_db TO Bob;
GRANT USAGE FOR SCHEMAS IN DATABASE sales_db TO Bob;
GRANT SELECT ON sales_db.public.tickit_sales_redshift TO Bob;
```

데이터베이스 또는 스키마에 대한 액세스 권한을 부여받은 후에도 사용자는 액세스하려는 데이터베이스 또는 스키마의 모든 객체에 대한 관련 권한을 부여받아야 합니다.

## WITH PERMISSIONS를 사용한 세분화된 공유
<a name="share-datashare-writes"></a>

WITH PERMISSIONS을 사용하여 세분화된 공유를 사용해 클러스터 또는 Serverless 작업 그룹이 데이터 공유를 쿼리하도록 할 수 있습니다. 이 프로세스에서는 데이터 공유가 사용자 계정의 다른 클러스터 또는 Amazon Redshift Serverless 네임스페이스에서 시작되거나 다른 계정에서 가져왔고 사용 중인 네임스페이스와 연결되어 있다고 가정합니다.

1. 소비자 데이터베이스 관리자는 데이터 공유에서 데이터베이스를 생성할 수 있습니다.

   ```
   CREATE DATABASE my_ds_db [WITH PERMISSIONS] FROM DATASHARE my_datashare OF NAMESPACE 'abc123def';
   ```

   WITH PERMISSIONS을 사용하여 데이터베이스를 만드는 경우 데이터 공유 객체에 대한 세분화된 권한을 다양한 사용자 및 역할에 부여할 수 있습니다. 이렇게 하지 않으면 데이터 공유 데이터베이스에 대한 USAGE 권한이 부여된 모든 사용자 및 역할에 데이터 공유 데이터베이스 내의 모든 객체에 대한 모든 권한이 부여됩니다.

1. 다음은 Redshift 데이터베이스 사용자 또는 역할에 권한을 부여하는 방법을 보여줍니다. 이 문을 실행하려면 로컬 데이터베이스에 연결되어 있어야 합니다. 권한 부여 문을 실행하기 전에 데이터 공유 데이터베이스에서 USE 명령을 실행하면 이러한 문을 실행할 수 없습니다.

   ```
   GRANT USAGE ON DATABASE my_ds_db TO ROLE data_eng;
   GRANT CREATE, USAGE ON SCHEMA my_ds_db.my_shared_schema TO ROLE data_eng;
   GRANT ALL ON ALL TABLES IN SCHEMA my_ds_db.my_shared_schema TO ROLE data_eng;
    
   GRANT USAGE ON DATABASE my_ds_db TO bi_user;
   GRANT USAGE ON SCHEMA my_ds_db.my_shared_schema TO bi_user;
   GRANT SELECT ON my_ds_db.my_shared_schema.table1 TO bi_user;
   ```