GRANT <privileges> … TO APPLICATION ROLE
GRANT <privileges> … TO APPLICATION ROLE
보호 가능한 스키마 수준 객체(securable schema-level object)에 대한 하나 이상의 접근 권한을 애플리케이션 역할에 부여하는 명령이에요. 부여할 수 있는 권한은 객체별로 다릅니다.
출처: 문서
본문
구문 (Syntax)
GRANT {
{ <schemaPrivileges> | ALL [ PRIVILEGES ] } ON SCHEMA <name>
| { <schemaObjectPrivileges> | ALL [ PRIVILEGES ] } ON { <object_name> | ALL <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
| { <schemaObjectPrivileges> | ALL [ PRIVILEGES ] } ON FUTURE <object_type_plural> IN SCHEMA <schema_name>
}
TO APPLICATION ROLE <name> [ WITH GRANT OPTION ]
여기서:
schemaPrivileges ::=
{
ADD SEARCH OPTIMIZATION
| CREATE {
ALERT | EXTERNAL TABLE | FILE FORMAT | FUNCTION
| IMAGE REPOSITORY | MATERIALIZED VIEW | PIPE | PROCEDURE
| { AGGREGATION | MASKING | PASSWORD | PROJECTION | ROW ACCESS | SESSION } POLICY
| SECRET | SEMANTIC VIEW | SEQUENCE | SERVICE | SNAPSHOT | STAGE | STREAM
| TAG | TABLE | TASK | VIEW
}
| MODIFY | MONITOR | USAGE
}
[ , ... ]
schemaObjectPrivileges ::=
-- For ALERT
{ MONITOR | OPERATE } [ , ... ]
-- For DYNAMIC TABLE
OPERATE, SELECT [ , ...]
-- For EVENT TABLE
{ INSERT | SELECT } [ , ... ]
-- For FILE FORMAT, FUNCTION (UDF or external function), PROCEDURE, SECRET, SEQUENCE, SNAPSHOT, or TYPE
USAGE [ , ... ]
-- For IMAGE REPOSITORY
{ READ, WRITE } [ , ... ]
-- For MATERIALIZED VIEW
{ APPLYBUDGET | REFERENCES | SELECT } [ , ... ]
-- For PIPE
{ APPLYBUDGET | MONITOR | OPERATE } [ , ... ]
-- For { AGGREGATION | MASKING | PACKAGES | PASSWORD | PROJECTION | ROW ACCESS | SESSION } POLICY or TAG
APPLY [ , ... ]
-- For SECRET
READ, USAGE [ , ... ]
-- For SEMANTIC VIEW
REFERENCES [ , ... ]
-- For SERVICE
{ MONITOR | OPERATE } [ , ... ]
-- For external STAGE
USAGE [ , ... ]
-- For internal STAGE
READ [ , WRITE ] [ , ... ]
-- For STREAM
SELECT [ , ... ]
-- For TABLE
{ APPLYBUDGET | DELETE | EVOLVE SCHEMA | INSERT | REFERENCES | SELECT | TRUNCATE | UPDATE } [ , ... ]
-- For TAG
READ
-- For TASK
{ APPLYBUDGET | MONITOR | OPERATE } [ , ... ]
-- For VIEW
{ REFERENCES | SELECT } [ , ... ]
필수 파라미터 (Required parameters)
- object_name — 권한이 부여되는 객체의 식별자를 지정해요.
- object_type — 스키마 수준 객체의 객체 유형.
ALERT,DYNAMIC TABLE,EVENT TABLE,EXTERNAL TABLE,FILE FORMAT,FUNCTION,MASKING POLICY,MATERIALIZED VIEW,NETWORK RULE,PACKAGES POLICY,PASSWORD POLICY,PIPE,PROCEDURE,ROW ACCESS POLICY,SECRET,SEMANTIC VIEW,SESSION POLICY,SEQUENCE,STAGE,STREAM,TABLE,TAG,TASK,TYPE,VIEW. - object_type_plural — object_type의 복수형(예: TABLES, VIEWS). 파이프에 대한 대량 부여는 허용되지 않아요.
- name — 수신 애플리케이션 역할(권한이 부여되는 역할)의 식별자를 지정해요.
선택 파라미터 (Optional parameters)
- ON FUTURE — 기존 객체가 아니라 지정된 유형의 새(즉 미래) 스키마 객체에 권한이 부여됨을 지정해요. future grants는
REVOKE <privileges> … FROM APPLICATION ROLE을 ON FUTURE 키워드와 함께 사용하여 언제든 취소할 수 있어요. 기존 객체에 부여된 권한은 유지돼요. - WITH GRANT OPTION — 지정하면 수신 애플리케이션 역할이 권한을 다른 애플리케이션 역할에 부여할 수 있게 해요. 기본값: 없음. 참고: WITH GRANT OPTION 절은 IMPORTED PRIVILEGES 권한을 지원하지 않아요.
사용 메모 (Usage notes)
- 애플리케이션의 객체에 권한을 부여하고 취소하려면 애플리케이션 역할을 사용해야 해요.
- 이 명령은 애플리케이션 제공자(provider)인지 소비자(consumer)인지에 따라 다른 제한이 있어요.
- 애플리케이션 소비자는 애플리케이션 역할에 관해 다음을 할 수 없어요:
- 애플리케이션 역할에 관한 객체 권한을 부여하거나 취소.
- 애플리케이션 역할을 데이터베이스나 공유에 부여하거나, 애플리케이션 역할을 데이터베이스나 공유에서 취소.
- 애플리케이션 역할을 같은 애플리케이션 또는 다른 애플리케이션에 부여하거나, 같은 애플리케이션 또는 다른 애플리케이션에서 취소.
- 다음 항목은 애플리케이션 역할에 관한 애플리케이션 제공자에게 적용돼요.
- 스키마의 객체 또는 지정된 유형의 모든 객체에 대한 OWNERSHIP 권한을 애플리케이션 역할에 부여하여 한 애플리케이션 역할에서 다른 애플리케이션 역할로 객체 소유권을 이전하려면
GRANT OWNERSHIP명령을 사용해요. - 단일 GRANT 문장에서 같은 객체 유형에 대해 여러 권한을 지정할 수 있고(각 권한은 쉼표로 구분), GRANT 명령을 실행하는 애플리케이션 역할이 보유하고 부여할 수 있는 권한만 대상 애플리케이션 역할에 실제로 부여돼요. 부여할 수 없는 권한에 대해 경고 메시지가 반환돼요.
- 특정 애플리케이션 역할에 부여된 권한은 그 애플리케이션 역할이 부여된 다른 애플리케이션 역할과 역할 계층 구조 내의 다른 더 높은 수준 애플리케이션 역할에 자동으로 상속돼요.
- 스키마의 객체 또는 지정된 유형의 모든 객체에 대한 OWNERSHIP 권한을 애플리케이션 역할에 부여하여 한 애플리케이션 역할에서 다른 애플리케이션 역할로 객체 소유권을 이전하려면
- 관리 액세스 스키마(managed access schemas)에서:
- 객체에 대한 OWNERSHIP 권한은 스키마 소유자의 하위 역할에만 이전할 수 있어요.
- 스테이지의 경우:
- USAGE는 외부 스테이지에만 적용돼요.
- READ | WRITE는 내부 스테이지에만 적용돼요. 내부 스테이지에 WRITE 권한을 부여하려면 먼저 스테이지에 READ 권한이 부여되어야 해요.
- 개별 UDF나 저장 프로시저에 권한을 부여할 때 인자의 데이터 유형을 지정해야 해요:
<function_name>( [ <arg_type> [ , ... ] ] )
Snowflake는 인자 데이터 유형으로 스키마 내에서 같은 이름을 가진 UDF와 저장 프로시저를 해석해요.
접근 제어 요구사항 (Access control requirements)
- 이 명령은 애플리케이션 내에서만 실행할 수 있어요.
- 애플리케이션이 소유한 객체에만 권한을 부여하거나 취소할 수 있어요. 이 객체를 확인하려면
SHOW OBJECTS명령을 사용해요:
SHOW OBJECTS OWNED BY APPLICATION myapp;
- 관리 액세스 스키마에 관해:
- 관리 액세스 스키마(즉
CREATE SCHEMA … WITH MANAGED ACCESS구문으로 만든 스키마)에서 객체 소유자는 grant 결정을 내릴 능력을 잃어요. 관리 액세스 스키마의 객체에 권한을 부여할 수 있는 역할:- 스키마 소유자(즉 스키마에 OWNERSHIP 권한이 있는 역할)이기 때문에 애플리케이션 역할.
- 애플리케이션 역할을 상속하는 역할.
- 전역 MANAGE GRANTS 권한이 있는 역할은 스키마의 객체에 권한을 부여할 수 있어요. 전역 MANAGE GRANTS 권한을 가진 역할은 현재(grantor) 역할에 추가 권한을 부여할 수 있어요.
- 관리 액세스 스키마(즉
스키마 객체의 Future grants
이 섹션의 메모는 스키마의 객체에 future grants를 할당할 때(즉 ON FUTURE 키워드를 사용할 때) 적용돼요.
고려 사항 (Considerations)
- 스키마에 대해 같은 객체 유형의 future grants가 정의되면, 스키마 수준의 grant가 데이터베이스 수준의 grant보다 우선하고 데이터베이스 수준의 grant는 무시돼요. 이 동작은 한 애플리케이션 역할 또는 다른 애플리케이션 역할에 부여된 미래 객체의 권한에 적용돼요.
제한 사항 (Restrictions and limitations)
- 각 보호 가능한 객체 유형에 대해 OWNERSHIP 권한의 future grant는 하나만 허용돼요.
- 다음 유형의 객체에는 future grants를 정의할 수 없어요: Compute pool, External function, Image repository, Organization profile, 정책 객체(Aggregation policy, Join policy, Masking policy, Packages policy, Projection policy, Row access policy, Session policy, Storage lifecycle policy), Snapshot, Tag.
- 데이터베이스에서 지정된 유형의 객체에 대한 OWNERSHIP 권한의 future grant는 관리 액세스 스키마의 새 객체에는 적용되지 않아요.
- 관리 액세스 스키마의 객체에 대한 future grants에는 다음 제한이 적용돼요:
- 객체에 대한 OWNERSHIP 권한의 future grant는 스키마 소유자(즉 스키마에 OWNERSHIP 권한이 있는 역할)의 하위 역할에만 적용될 수 있어요.
- 관리 액세스 스키마의 소유권이 다른 역할로 이전되기 전에, ON FUTURE 키워드와 함께
REVOKE <privileges> … FROM ROLE을 사용하여 OWNERSHIP 권한의 모든 열린 future grants를 취소해야 해요.
- future grants는 테이블 이름 변경 또는 교체(swap) 시 적용되지 않아요.
- future grants는 다음 제한과 함께 명명된 스테이지에서 지원돼요:
- WRITE 권한은 READ 권한 없이 지정할 수 없어요.
- READ 권한이 있으면 READ 권한을 취소할 수 없어요(WRITE 권한이 있으면).
- 내부 스테이지의 경우 READ 또는 WRITE 권한이 있는 future grants만 구체화돼요.
- 외부 스테이지의 경우 USAGE 권한이 있는 future grants만 구체화돼요.
- 관리 액세스 스키마에서 애플리케이션 역할과 전역 MANAGE GRANTS 권한이 있는 역할이 관리 액세스 스키마의 미래 객체에 권한을 부여할 수 있어요. 표준 스키마에서는 스키마의 미래 객체에 권한을 부여하려면 전역 MANAGE GRANTS 권한이 필요해요.
예시 (Example)
뷰에 대한 SELECT 권한을 애플리케이션 역할에 부여해요:
GRANT SELECT ON VIEW data.views.credit_usage
TO APPLICATION ROLE app_snowflake_credits;