GRANT <privileges> … TO SHARE
GRANT <privileges> … TO SHARE
데이터베이스 및 기타 지원되는 데이터베이스 객체(스키마, UDF, 테이블, 뷰)에 대한 접근 권한을 공유(share)에 부여하는 명령이에요. 이 객체들에 대한 권한을 부여하면 객체가 공유에 효과적으로 추가되며, 이 공유를 하나 이상의 소비자 계정과 공유할 수 있어요.
출처: 문서
본문
구문 (Syntax)
GRANT <objectPrivilege> ON
{ <name> DATABASE
| <name> SCHEMA
| <name> FUNCTION
| <name> SEMANTIC VIEW
| { <name> TABLE | ALL TABLES IN SCHEMA <schema_name> }
| { <name> EXTERNAL TABLE | ALL EXTERNAL TABLES IN SCHEMA <schema_name> }
| { <name> ICEBERG TABLE | ALL ICEBERG TABLES IN SCHEMA <schema_name> }
| { <name> DYNAMIC TABLE | ALL DYNAMIC TABLES IN SCHEMA <schema_name> }
| <name> TAG
| <name> VIEW }
TO SHARE <share_name>
여기서:
objectPrivilege ::=
-- For DATABASE
REFERENCE_USAGE [ , ... ]
-- For DATABASE, FUNCTION, or SCHEMA
USAGE [ , ... ]
-- For SEMANTIC VIEW
{ REFERENCES | SELECT } [ , ... ]
-- For TABLE
EVOLVE SCHEMA [ , ... ]
-- For EXTERNAL TABLE, ICEBERG TABLE, TABLE, or VIEW
SELECT [ , ... ]
-- For TAG
READ
파라미터
- name — 지정된 권한이 부여되는 객체의 식별자를 지정해요.
- schema_name — 모든 테이블에 대해 지정된 권한이 부여되는 스키마의 식별자를 지정해요.
- share_name — 지정된 권한이 부여되는 공유의 식별자를 지정해요.
사용 메모 (Usage notes)
- 공유에는 단일 데이터베이스에 대한 USAGE 권한만 부여할 수 있어요. 그러나 그 데이터베이스 내에서 여러 스키마, UDF, 테이블, 뷰에 대한 권한을 공유에 부여할 수 있어요.
- 개별 객체에 대한 권한은 별도의 GRANT 문장으로 공유에 부여해야 해요. 유일한 예외는 테이블(Apache Iceberg™ 테이블 포함)과 뷰에 대한 SELECT 권한이에요. ALL 절을 사용하여 지정된 스키마의 모든 테이블에 대한 SELECT를 공유에 부여할 수 있어요. 또한 공유가
SECURE_OBJECTS_ONLY=FALSE이면 지정된 스키마의 모든 뷰에 대한 SELECT를 공유에 부여할 수 있어요. - 기본적으로 뷰에 대한 SELECT 권한은 보안 뷰(secure views)에만 부여할 수 있어요. 비보안 뷰를 공유하려면 별도 지침을 참조해요.
- USAGE 권한은 보안 UDF에만 부여할 수 있어요. 비보안 UDF에 대한 USAGE 권한을 공유에 부여하려고 하면 오류가 반환돼요.
- 현재 다른 데이터베이스의 객체를 참조하는 UDF를 공유하는 것은 지원되지 않아요. 예를 들어 다른 데이터베이스의 보안 뷰를 참조하는 UDF에 USAGE를 부여하려고 하면 오류가 반환돼요.
- 여러 데이터베이스에 속한 객체를 참조하는 보안 뷰를 공유할 때는 REFERENCE_USAGE 권한을 다음과 같이 사용해요:
- REFERENCE_USAGE 권한은 각 데이터베이스에 개별적으로 부여해야 해요.
- 공유에 보안 뷰에 대한 SELECT 권한을 부여하기 전에 데이터베이스에 REFERENCE_USAGE 권한을 부여해야 해요.
- Secure Data Sharing: 데이터 제공자는 future grants로 새 객체를 공유에 자동 추가할 수 없어요. 즉 데이터 제공자는
GRANT <privilege> … TO SHARE문장으로 미래 객체에 대한 권한을 공유에 부여할 수 없어요. - 공유에서 만든 데이터베이스나 데이터베이스 객체를 재공유할 수 없어요. 공유에서 만든 데이터베이스나 데이터베이스 객체에 대한 USAGE 권한을 다른 공유에 부여하려고 하면 오류가 반환돼요.
- TABLE 객체가 Iceberg 테이블이면 명령은 그 Iceberg 테이블에 권한을 부여해요.
예시 (Examples)
단일 데이터베이스에서 객체를 공유하는 예시:
GRANT USAGE ON DATABASE mydb TO SHARE share1;
GRANT USAGE ON SCHEMA mydb.public TO SHARE share1;
GRANT USAGE ON FUNCTION mydb.shared_schema.function1 TO SHARE share1;
GRANT USAGE ON FUNCTION mydb.shared_schema.function2 TO SHARE share1;
GRANT SELECT ON ALL TABLES IN SCHEMA mydb.public TO SHARE share1;
GRANT SELECT ON ALL EXTERNAL TABLES IN SCHEMA mydb.public TO SHARE share1;
GRANT SELECT ON ALL ICEBERG TABLES IN SCHEMA mydb.public TO SHARE share1;
GRANT SELECT ON ALL DYNAMIC TABLES IN SCHEMA mydb.public TO SHARE share1;
GRANT USAGE ON SCHEMA mydb.shared_schema TO SHARE share1;
GRANT SELECT ON VIEW mydb.shared_schema.view1 TO SHARE share1;
GRANT SELECT ON VIEW mydb.shared_schema.view3 TO SHARE share1;
GRANT SELECT ON ICEBERG TABLE mydb.shared_schema.iceberg_table_1 TO SHARE share1;
GRANT SELECT ON DYNAMIC TABLE mydb.public TO SHARE share1;
다른 데이터베이스의 객체를 참조하는 보안 뷰를 공유하는 예시:
CREATE SECURE VIEW view2 AS SELECT * FROM database2.public.sampletable;
GRANT USAGE ON DATABASE database1 TO SHARE share1;
GRANT USAGE ON SCHEMA database1.schema1 TO SHARE share1;
GRANT REFERENCE_USAGE ON DATABASE database2 TO SHARE share1;
GRANT SELECT ON VIEW view2 TO SHARE share1;