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 명령을 실행하는 애플리케이션 역할이 보유하고 부여할 수 있는 권한만 대상 애플리케이션 역할에 실제로 부여돼요. 부여할 수 없는 권한에 대해 경고 메시지가 반환돼요.
    • 특정 애플리케이션 역할에 부여된 권한은 그 애플리케이션 역할이 부여된 다른 애플리케이션 역할과 역할 계층 구조 내의 다른 더 높은 수준 애플리케이션 역할에 자동으로 상속돼요.
  • 관리 액세스 스키마(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;

더 알아보기 (Learn more)