GRANT OWNERSHIP
GRANT OWNERSHIP
한 역할에서 다른 역할로 객체 또는 스키마의 지정된 유형의 모든 객체에 대한 소유권을 이전하는 명령이에요. 역할은 역할 또는 데이터베이스 역할을 의미해요. OWNERSHIP은 한 역할에서 다른 역할로만 부여될 수 있는 특수한 유형의 권한이며 취소할 수 없어요.
출처: 문서
본문
이 명령은 GRANT <privileges> … TO ROLE의 변형이에요.
구문 (Syntax)
클래스의 인스턴스가 아닌 객체 유형의 경우:
GRANT OWNERSHIP
{ ON {
<object_type> <object_name>
| ALL <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
}
| ON FUTURE <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
}
TO { ROLE <role_name> | DATABASE ROLE <database_role_name> }
[ { REVOKE | COPY } CURRENT GRANTS ]
클래스의 인스턴스의 경우:
GRANT OWNERSHIP
ON <instance_role_name>
TO { ROLE <role_name> | DATABASE ROLE <database_role_name> }
[ { REVOKE | COPY } CURRENT GRANTS ]
필수 파라미터 (Required parameters)
- object_name — 소유권을 이전하는 객체의 식별자를 지정해요.
- object_type — 객체 유형을 지정해요. 다음 중 하나:
AGENT,AGGREGATION POLICY,ALERT,AUTHENTICATION POLICY,COMPUTE POOL,CORTEX SEARCH SERVICE,DATA METRIC FUNCTION,DATABASE,DATABASE ROLE,DBT PROJECT,DYNAMIC TABLE,EVENT TABLE,EXPERIMENT,EXTERNAL TABLE,EXTERNAL VOLUME,FAILOVER GROUP,FILE FORMAT,FUNCTION,GATEWAY,GIT REPOSITORY,ICEBERG TABLE,IMAGE REPOSITORY,INTEGRATION,JOIN POLICY,MASKING POLICY,MATERIALIZED VIEW,MCP SERVER,NETWORK POLICY,NETWORK RULE,NOTEBOOK,ONLINE FEATURE TABLE,PACKAGES POLICY,PASSWORD POLICY,PIPE,PRIVACY POLICY,PROCEDURE,PROJECTION POLICY,REPLICATION GROUP,RESOURCE MONITOR,RESTRICTED SESSION SCOPE,ROLE,ROW ACCESS POLICY,SCHEMA,SEMANTIC VIEW,SESSION POLICY,SECRET,SEQUENCE,SNAPSHOT,SNAPSHOT POLICY,SNAPSHOT SET,STAGE,STORAGE LIFECYCLE POLICY,STREAM,TABLE,TAG,TASK,TYPE,USER,VIEW,WAREHOUSE,WORKSPACE - object_type_plural — object_type의 복수형(예: TABLES, VIEWS). 파이프와 데이터 메트릭 함수에 대한 대량 부여는 허용되지 않아요.
- role_name — 객체 소유권이 이전되는 역할의 식별자.
- database_role_name — 객체 소유권이 이전되는 데이터베이스 역할의 식별자. 식별자가
db_name.database_role_name형식으로 정규화되지 않았다면, 명령은 세션의 현재 데이터베이스에서 데이터베이스 역할을 찾아요. 소유권은 데이터베이스 역할을 포함하는 데이터베이스의 객체로 제한돼요.
선택 파라미터 (Optional parameters)
- [ REVOKE | COPY ] CURRENT GRANTS — 소유권이 새 역할로 이전될 때 객체의 모든 기존 아웃바운드 권한을 제거할지 또는 이전할지 지정해요. 아웃바운드 권한은 소유권이 변경되는 개별 객체에 부여된 모든 권한을 의미해요. 역할의 소유권을 이전할 때 current grants는 현재 역할에 부여된(역할 계층 구조를 만들기 위한) 모든 역할을 의미해요.
REVOKE— 새 역할로 소유권을 이전하기 전에 객체의 모든 아웃바운드 권한을 제거해야 하는 RESTRICT 의미론을 적용해요. 이는 새 소유 역할이 이미 권한이 부여된 객체를 알지 못한 채 상속하는 것을 방지하기 위한 것이에요. 소유권을 이전한 후 객체의 권한은 역할에 명시적으로 다시 부여해야 해요. REVOKE 키워드는GRANT OWNERSHIP ON FUTURE <object_type>(데이터베이스나 스키마의 지정된 유형의 미래 객체에 소유권 부여)에는 동작하지 않아요.COPY— 객체의 기존 아웃바운드 권한과 함께 소유권을 이전해요. 이전 후 새 소유자는 복사된 아웃바운드 권한의 grantor로 시스템에서 식별돼요(즉 객체의 SHOW GRANTS 출력에서 모든 권한의 GRANTED_BY 열에 새 소유자가 나열돼요). 결과적으로 소유권 변경 전에 나중에 재부여된 권한은 더 이상 원래 grantor 역할에 의존하지 않아요.REVOKE <privileges> … FROM ROLE을 CASCADE 옵션으로 사용하여 권한을 취소해도 이러한 이전에 종속된 권한 부여를 재귀적으로 취소하지 않아요. 권한은 명시적으로 취소해야 해요. COPY 파라미터는 다음 중 하나 이상이 필요해요:- 활성 역할이 계정에 MANAGE GRANTS 권한을 가짐.
- 활성 역할이 새 소유자(또는 더 높은) 역할임. PUBLIC 시스템 역할은 모든 역할에 부여되므로 이 요구사항에 자연히 포함돼요. 활성 역할은 기본 및 보조 역할을 모두 고려해요.
- 기본값: 없음. 기존 아웃바운드 권한에 대해 어떤 작업도 수행하지 않아요.
참고: 객체의 기존 아웃바운드 권한이 REVOKE되거나 COPY되지 않으면
GRANT OWNERSHIP문장은 실패해요.
사용 메모 (Usage notes)
- 다음 객체에 대해 OWNERSHIP 권한을 이전할 수 없어요:
- APPLICATION ROLE
- CONNECTION (ACCOUNTADMIN 역할만 connection 객체에 OWNERSHIP 권한을 가질 수 있어요)
- 클래스의 인스턴스
- 머신러닝 객체(모델, 모델 버전, 모델 모니터)
- SERVICE
- SHARE
- 객체에 아웃바운드(즉 종속) 권한이 존재하면
GRANT OWNERSHIP문장은 차단돼요. 객체 소유자(또는 더 높은 역할)는 COPY CURRENT GRANTS 옵션으로 모든 현재 권한을 새 소유 역할에 명시적으로 복사하거나, REVOKE CURRENT GRANTS 옵션으로 소유권 이전 전에 객체의 모든 아웃바운드 권한을 취소할 수 있어요. 역할 객체의 경우 이 절을 지정하지 않으면 역할을 새 소유자 역할로 이전할 때GRANT OWNERSHIP문장이 차단되지 않아요. 새 소유자 역할이 업데이트돼요. 그러나SHOW GRANTS OF ROLE transferred_role명령은 이전된 역할이 같은 사용자에게 부여된 두 행을 보여줘요: 한 행의 granted_by 열 값은 원래 소유자 역할에 의한 grant이고, 다른 행의 값은 새 소유자 역할에 의한 grant예요. - Snowflake는 공유 데이터베이스에서
GRANT OWNERSHIP … REVOKE CURRENT GRANTS명령을 방지해요. - 소유권 이전은 명령이 실행될 당시 존재하는 객체에만 영향을 미쳐요. 명령 실행 후 생성된 객체는 생성 시 사용 중인 역할이 소유해요.
- 다음 유형의 객체 소유권 이전은 추가 조건이 충족되지 않으면 차단돼요:
- Pipes: 파이프는 일시 중지되어야 해요.
- Tasks: 예약된 태스크를 일시 중지해야 해요. 지정된 데이터베이스나 스키마의 모든 태스크가 다른 역할로 이전되면 Snowflake는 컨테이너의 모든 태스크를 자동으로 일시 중지해요. COPY CURRENT GRANTS 옵션으로 같은 역할로 이전된 태스크도 자동으로 일시 중지돼요.
- 같은 객체 유형에 대한 future grants가 데이터베이스와 스키마 수준 모두에서 정의되면, 스키마 수준의 grant가 데이터베이스 수준의 grant보다 우선하며 데이터베이스 수준의 grant는 무시돼요.
- 구체화된 뷰의 소유권을 부여하려면
GRANT OWNERSHIP ON VIEW를 사용해요. 별도의GRANT OWNERSHIP ON MATERIALIZED VIEW문장은 없어요. - 하이브리드 테이블의 소유권을 부여하려면
GRANT OWNERSHIP ON TABLE을 사용해요. 별도의GRANT OWNERSHIP ON HYBRID TABLE문장은 없어요. - 공유에 대한 OWNERSHIP 권한은 이전할 수 없으며 connection에 대한 OWNERSHIP 권한도 이전할 수 없어요. ACCOUNTADMIN 역할만 connection을 소유할 수 있어요.
- 동적 테이블에 OWNERSHIP 권한을 부여할 때, 수신 역할이 동적 테이블을 포함하는 데이터베이스와 스키마, 그리고 테이블 새로고침에 사용되는 웨어하우스에 USAGE 권한이 있는지 확인해요. 그렇지 않으면 이후의 예약된 새로고침이 실패해요.
- 미래 동적 테이블에 OWNERSHIP 권한을 부여할 때:
- 동적 테이블이 생성 시 초기화(
INITIALIZE = ON_CREATE)로 설정된 경우 새 역할이 참조된 객체에 충분한 권한이 있는지 확인해요. 그렇지 않으면 초기 새로고침이 실패하고 객체를 찾을 수 없다는 오류가 발생해요. - 동적 테이블이 일정에 따라 초기화(
INITIALIZE = ON_SCHEDULE)로 설정된 경우 새 역할이 참조된 객체에 충분한 권한이 있는지 확인해요. 그렇지 않으면 이후의 예약된 새로고침이 실패해요.
- 동적 테이블이 생성 시 초기화(
- Apache Iceberg™ 테이블의 소유권을 다른 역할로 이전할 때 Snowflake는 테이블과 연결된 외부 볼륨(외부 관리 테이블이면 카탈로그 통합)에 대한 OWNERSHIP 권한을 이전하지 않아요. 대상 역할에게 테이블과 관련 객체에 대한 완전한 제어를 주려면 외부 볼륨과 카탈로그 통합에 대한 OWNERSHIP 권한을 그 역할에게 부여해야 해요.
- 노트북의 소유권이 새 역할로 이전된 후, 원래 소유자 역할은 노트북에 대한 모든 접근을 잃어요.
- 데이터베이스 역할: 소유권은 데이터베이스 역할과 같은 데이터베이스의 객체에만 이전할 수 있어요.
- 외부 테이블이나 그 부모 데이터베이스에 소유권을 이전하면 AUTO_REFRESH 속성을 FALSE로 설정하여 테이블 메타데이터의 자동 새로고침을 차단해요. 소유권을 이전한 후 속성을 재설정하려면
ALTER EXTERNAL TABLE명령을 사용해요.
예시 (Examples)
역할 (Roles)
manager 역할이 소유한 mydb 데이터베이스의 모든 아웃바운드 권한을 취소한 후 analyst 역할로 소유권을 이전해요:
REVOKE ALL PRIVILEGES ON DATABASE mydb FROM ROLE manager;
GRANT OWNERSHIP ON DATABASE mydb TO ROLE analyst;
GRANT ALL PRIVILEGES ON DATABASE mydb TO ROLE analyst;
이 예시는 소유권 이전의 기본(그리고 권장되는) 다단계 프로세스를 보여줘요.
단일 단계로 mydb.public 스키마의 기존 테이블의 모든 권한을 취소하고(현재 권한 복사본과 함께) 테이블 소유권을 analyst 역할로 이전해요:
GRANT OWNERSHIP ON ALL TABLES IN SCHEMA mydb.public TO ROLE analyst COPY CURRENT GRANTS;
mydb.public.mytable 테이블의 소유권을 현재 모든 아웃바운드 권한 복사본과 함께 analyst 역할에 부여해요:
GRANT OWNERSHIP ON TABLE mydb.public.mytable TO ROLE analyst COPY CURRENT GRANTS;
data_science 역할에서 finance 역할로 mynotebook이라는 노트북의 소유권을 부여해요:
USE ROLE data_science;
GRANT OWNERSHIP ON NOTEBOOK db_one.schema_one.mynotebook TO ROLE finance;
데이터베이스 역할 (Database roles)
단일 단계로 mydb.public 스키마의 기존 테이블의 모든 권한을 취소하고(현재 권한 복사본과 함께) 테이블 소유권을 mydb.dr1 데이터베이스 역할로 이전해요:
GRANT OWNERSHIP ON ALL TABLES IN SCHEMA mydb.public
TO DATABASE ROLE mydb.dr1
COPY CURRENT GRANTS;
mydb.public.mytable 테이블의 소유권을 현재 모든 아웃바운드 권한 복사본과 함께 mydb.dr1 데이터베이스 역할에 부여해요:
GRANT OWNERSHIP ON TABLE mydb.public.mytable
TO ROLE mydb.dr1
COPY CURRENT GRANTS;
공유 데이터베이스 (Shared database)
공유 데이터베이스의 OWNERSHIP 권한을 이전하려면 다음 명령을 사용해요:
REVOKE USAGE ON DATABASE mydb FROM SHARE myshare;
GRANT OWNERSHIP ON DATABASE mydb TO ROLE r2;
GRANT USAGE ON DATABASE mydb TO ROLE r2;
필요하면 GRANT <privilege> … TO SHARE 명령으로 데이터베이스를 공유에 다시 부여해요.