GRANT <privileges> … TO USER

GRANT <privileges> … TO USER

보호 가능한 객체(securable object)에 대한 하나 이상의 접근 권한을 사용자에게 부여하는 명령이에요. 부여할 수 있는 권한은 객체별로 다릅니다.

출처: 문서

본문

구문 (Syntax)

GRANT {  <globalPrivileges>         | ALL [ PRIVILEGES ] } ON ACCOUNT
       | { <accountObjectPrivileges>  | ALL [ PRIVILEGES ] } ON { USER | RESOURCE MONITOR | WAREHOUSE | COMPUTE POOL | DATABASE | INTEGRATION | CONNECTION | FAILOVER GROUP | REPLICATION GROUP | EXTERNAL VOLUME }
       | { <schemaPrivileges>         | ALL [ PRIVILEGES ] } ON { SCHEMA <name>  | ALL SCHEMAS IN DATABASE <db_name>  }
       | { <schemaObjectPrivileges>   | ALL [ PRIVILEGES ] } ON { <object_name>   | ALL <object_type_plural>  IN { DATABASE <db_name>  | SCHEMA <schema_name>  } }
  TO [ USER ] <user_name>  [ WITH GRANT OPTION ]

여기서:

globalPrivileges ::=
  {
      | ATTACH POLICY | AUDIT | BIND SERVICE ENDPOINT
      | APPLY {
         { AGGREGATION | AUTHENTICATION | JOIN | MASKING | PACKAGES | PASSWORD
           | PROJECTION | ROW ACCESS | SESSION } POLICY
         | TAG }
      | EXECUTE { ALERT | DATA METRIC FUNCTION | MANAGED ALERT | MANAGED TASK | TASK }
      | IMPORT SHARE
      | MANAGE { ACCOUNT SUPPORT CASES | EVENT SHARING | GRANTS | LISTING AUTO FULFILLMENT | ORGANIZATION SUPPORT CASES | USER SUPPORT CASES | WAREHOUSES }
      | MODIFY { LOG LEVEL | TRACE LEVEL | SESSION LOG LEVEL | SESSION TRACE LEVEL }
      | MONITOR { EXECUTION | SECURITY | USAGE }
      | OVERRIDE SHARE RESTRICTIONS | PURCHASE DATA EXCHANGE LISTING | RESOLVE ALL
      | READ SESSION
  }
  [ , ... ]
accountObjectPrivileges ::=
-- For COMPUTE POOL
   { MODIFY | MONITOR | OPERATE | USAGE } [ , ... ]
-- For CONNECTION
   { FAILOVER } [ , ... ]
-- For DATABASE
   { APPLYBUDGET
   | IMPORTED PRIVILEGES | MODIFY | MONITOR | USAGE } [ , ... ]
-- For EXTERNAL VOLUME
   { USAGE } [ , ... ]
-- For FAILOVER GROUP
   { FAILOVER | MODIFY | MONITOR | REPLICATE } [ , ... ]
-- For INTEGRATION
   { USAGE | USE_ANY_ROLE } [ , ... ]
-- For REPLICATION GROUP
   { MODIFY | MONITOR | REPLICATE } [ , ... ]
-- For RESOURCE MONITOR
   { MODIFY | MONITOR } [ , ... ]
-- For USER
   { MONITOR } [ , ... ]
-- For WAREHOUSE
   { APPLYBUDGET | MODIFY | MONITOR | USAGE | OPERATE } [ , ... ]
schemaPrivileges ::=

    ADD SEARCH OPTIMIZATION | APPLYBUDGET
   | MODIFY | MONITOR | USAGE
   [ , ... ]
schemaObjectPrivileges ::=
  -- For ALERT
     { MONITOR | OPERATE } [ , ... ]
  -- For DATA METRIC FUNCTION
     USAGE [ , ... ]
  -- For DYNAMIC TABLE
     MONITOR, OPERATE, SELECT [ , ...]
  -- For EVENT TABLE
     { APPLYBUDGET | DELETE | REFERENCES | SELECT | TRUNCATE } [ , ... ]
  -- For FILE FORMAT, FUNCTION (UDF or external function), MODEL, PROCEDURE, SECRET, SEQUENCE, SNAPSHOT, or TYPE
     USAGE [ , ... ]
  -- For GIT REPOSITORY
     { READ, WRITE } [ , ... ]
  -- For HYBRID TABLE
     { APPLYBUDGET | DELETE | INSERT | REFERENCES | SELECT | TRUNCATE | UPDATE } [ , ... ]
  -- For IMAGE REPOSITORY
     { READ, WRITE } [ , ... ]
  -- For ICEBERG TABLE
     { APPLYBUDGET | DELETE | INSERT | REFERENCES | SELECT | TRUNCATE | UPDATE } [ , ... ]
  -- For MATERIALIZED VIEW
     { APPLYBUDGET | REFERENCES | SELECT } [ , ... ]
  -- For PIPE
     { APPLYBUDGET | MONITOR | OPERATE } [ , ... ]
  -- For { AGGREGATION | AUTHENTICATION | MASKING | JOIN | PACKAGES | PASSWORD | PRIVACY | 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 STREAMLIT
     USAGE [ , ... ]
  -- For TABLE
     { APPLYBUDGET | DELETE | EVOLVE SCHEMA | INSERT | REFERENCES | SELECT | SELECT ERROR TABLE | TRUNCATE | UPDATE } [ , ... ]
  -- For TAG
     READ
  -- For TASK
     { APPLYBUDGET | MONITOR | OPERATE } [ , ... ]
  -- For VIEW
     { REFERENCES | SELECT } [ , ... ]

필수 파라미터 (Required parameters)

  • object_name — 권한이 부여되는 객체의 식별자를 지정해요.
  • object_type — 스키마 수준 객체의 객체 유형을 지정해요: AGENT, AGGREGATION POLICY, ALERT, AUTHENTICATION POLICY, CORTEX SEARCH SERVICE, DATA METRIC FUNCTION, DATASET, DBT PROJECT, DYNAMIC TABLE, EVENT TABLE, EXPERIMENT, EXTERNAL TABLE, FILE FORMAT, FUNCTION, GATEWAY, GIT REPOSITORY, IMAGE REPOSITORY, ICEBERG TABLE, INTERACTIVE TABLE, JOIN POLICY, MASKING POLICY, MATERIALIZED VIEW, MCP SERVER, MODEL, MODEL MONITOR, NETWORK RULE, NOTEBOOK, ONLINE FEATURE TABLE, PACKAGES POLICY, PASSWORD POLICY, PIPE, PRIVACY POLICY, PROCEDURE, PROJECTION POLICY, RESTRICTED SESSION SCOPE, ROW ACCESS POLICY, SECRET, SEMANTIC VIEW, SERVICE, SESSION POLICY, SEQUENCE, SNAPSHOT, SNAPSHOT POLICY, SNAPSHOT SET, STAGE, STORAGE LIFECYCLE POLICY, STREAM, STREAMLIT, TABLE, TAG, TASK, TYPE, VIEW, WORKSPACE.
  • object_type_plural — object_type의 복수형(예: TABLES, VIEWS). 파이프에 대한 대량 부여는 허용되지 않아요.
  • user_name — 수신 사용자(권한이 부여되는 사용자)의 식별자를 지정해요.

선택 파라미터 (Optional parameters)

  • WITH GRANT OPTION — 지정하면 수신 사용자가 권한을 다른 역할이나 사용자에게 부여할 수 있게 해요. 기본값: 없음. 참고: WITH GRANT OPTION 파라미터는 IMPORTED PRIVILEGES 권한을 지원하지 않아요.

사용 메모 (Usage notes)

  • 사용자에게 직접 할당된 권한은 사용자가 모든 보조 역할(secondary roles)을 활성화한 경우에만 유효해요.
  • 사용자에게 직접 권한을 부여하면 계정에서 권한 부여가 확산될 수 있어요. 개인 간 공유 시나리오 외에는 사용자가 Snowflake에서 필요한 접근을 관리하도록 권한을 역할에 부여하는 것을 권장해요.
  • Future grants는 사용할 수 없어요.
  • CREATE 및 OWNERSHIP 권한은 사용자에게 부여할 수 없어요.
  • 어떤 클래스에도 직접 권한을 부여하거나 취소할 수 없어요.
  • 단일 GRANT 문장에서 같은 객체 유형에 대해 여러 권한을 지정할 수 있고(각 권한은 쉼표로 구분), GRANT 명령을 실행하는 사용자가 보유하고 부여할 수 있는 권한만 대상 역할에 실제로 부여돼요. 부여되지 않은 권한에 대해 경고 메시지가 반환돼요.
  • 태그에는 ALL [ PRIVILEGES ]를 지정할 수 없어요.
  • 스키마에 ALL [ PRIVILEGES ]를 부여하려고 해도 클래스에 권한을 부여하지 않아요.
  • 스키마와 스키마의 객체의 경우, 컨테이너(즉 데이터베이스 또는 스키마) 내의 같은 유형의 모든 객체에 권한을 부여하는 ALL object_type_plural IN container 옵션이 제공돼요. 이 옵션은 편의를 제공하며, 내부적으로 명령이 각 객체에 대한 일련의 개별 GRANT 명령으로 확장돼요. 이 옵션은 컨테이너 내에 현재 존재하는 객체에만 영향을 미쳐요. 권한의 대량 부여는 Snowflake 모델에서 권장되지 않아요. 대신 공유 역할을 만들고 그 역할로 객체를 만들어 역할이 부여된 모든 사용자가 자동으로 접근할 수 있게 하는 것이 좋아요. ALL TAGSALL MASKING POLICIES는 지정할 수 없어요.
  • 스테이지의 경우:
    • USAGE는 외부 스테이지에만 적용돼요.
    • READ | WRITE는 내부 스테이지에만 적용돼요. 내부 스테이지에 WRITE 권한을 부여하려면 먼저 스테이지에 READ 권한이 부여되어야 해요.
  • 개별 UDF나 저장 프로시저에 권한을 부여할 때 인자의 데이터 유형을 udf_or_stored_procedure_name ( [ arg_data_type [ , ... ] ] ) 같은 구문으로 지정해야 해요. Snowflake는 인자 데이터 유형으로 스키마 내에서 같은 이름을 가진 UDF나 저장 프로시저를 해석해요.
  • 동적 테이블의 경우 수신 사용자는 동적 테이블을 포함하는 데이터베이스와 스키마, 그리고 테이블 새로고침에 사용되는 웨어하우스에 USAGE 권한이 부여되어야 해요.
  • 개별 UDF에 권한을 부여할 때 udf_name ( [ arg_data_type , ... ] ) 같은 구문으로 UDF의 인자 데이터 유형을 지정해야 해요.
  • 개별 저장 프로시저에 권한을 부여할 때 procedure_name ( [ arg_data_type , ... ] ) 같은 구문으로 프로시저의 인자 데이터 유형을 지정해야 해요.

접근 제어 요구사항 (Access control requirements)

개별 객체에 권한 부여: 일반적으로 다음 권한 중 하나를 가진 역할이나 사용자는 객체에 대한 권한을 다른 사용자에게 부여할 수 있어요:

  • 전역 MANAGE GRANTS 권한. SECURITYADMIN과 ACCOUNTADMIN 시스템 역할만 MANAGE GRANTS 권한을 가지며, 사용자 지정 역할이나 사용자에게 부여할 수 있어요.
  • OWNERSHIP 권한. 객체에 OWNERSHIP 권한이 있는 역할.
  • USAGE 권한. 스키마 객체(테이블, 뷰 등)에 권한을 부여할 때 역할이나 사용자는 부모 데이터베이스와 스키마에 대한 USAGE 권한도 있어야 해요.

GRANT privileges ... TO USER WITH GRANT OPTION 명령으로 사용자에게 권한이 부여되었다면, 그 사용자는 같은 권한을 다른 사용자나 역할에 다시 부여할 수 있어요. 관리 액세스 스키마(즉 CREATE SCHEMA ... WITH MANAGED ACCESS 구문으로 만든 스키마)에서 객체 소유자는 grant 결정을 내릴 능력을 잃어요. 스키마 소유자(즉 스키마에 OWNERSHIP 권한이 있는 역할) 또는 전역 MANAGE GRANTS 권한이 있는 역할만 그 스키마의 객체에 권한을 부여할 수 있어요. 전역 MANAGE GRANTS 권한을 가진 역할은 현재(grantor) 역할이나 사용자에게 추가 권한을 부여할 수 있어요.

예시 (Examples)

Streamlit 애플리케이션에 대한 USAGE 권한을 특정 사용자 joe에게 부여해요:

GRANT USAGE ON STREAMLIT streamlit_db.streamlit_schema.streamlit_app TO USER joe;

프로시저에 대한 USAGE 권한을 특정 사용자 user1에게 부여해요:

GRANT USAGE ON PROCEDURE mydb.myschema.myprocedure(number) TO USER user1;

더 알아보기 (Learn more)