REVOKE <privileges> … FROM ROLE

REVOKE <privileges> … FROM ROLE

보호 가능한 객체(securable object)에 대한 하나 이상의 권한을 역할 또는 데이터베이스 역할에서 제거하는 명령이에요. 취소할 수 있는 권한은 객체별로 다릅니다.

출처: 문서

본문

역할: 역할에서 취소할 수 있는 권한은 다음 범주로 그룹화돼요:

  • 전역 권한(Global privileges)
  • 계정 객체(리소스 모니터, 가상 웨어하우스, 데이터베이스)의 권한
  • 스키마의 권한
  • 스키마 객체(테이블, 뷰, 스테이지, 파일 형식, UDF, 시퀀스)의 권한

데이터베이스 역할: 데이터베이스 역할에서 취소할 수 있는 권한은 다음 범주로 그룹화돼요:

  • 데이터베이스 역할을 포함하는 데이터베이스의 권한.
  • 데이터베이스 역할을 포함하는 데이터베이스의 스키마의 권한.
  • 데이터베이스 역할을 포함하는 데이터베이스의 스키마 객체(테이블, 뷰, 스테이지, 파일 형식, UDF, 시퀀스)의 권한.

구문 (Syntax)

계정 역할(Account roles):

REVOKE [ GRANT OPTION FOR ]
    {
       { <globalPrivileges>         | ALL [ PRIVILEGES ] } ON ACCOUNT
     | { <accountObjectPrivileges>  | ALL [ PRIVILEGES ] } ON { 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>  }
     | { <schemaPrivileges>         | ALL [ PRIVILEGES ] } ON { FUTURE SCHEMAS IN DATABASE <db_name>  }
     | { <schemaObjectPrivileges>   | ALL [ PRIVILEGES ] } ON { <object_name>   | ALL <object_type_plural>  IN SCHEMA <schema_name>  }
     | { <schemaObjectPrivileges>   | ALL [ PRIVILEGES ] } ON FUTURE <object_type_plural>  IN { DATABASE <db_name>  | SCHEMA <schema_name>  }
    }
  FROM [ ROLE ] <role_name>  [ RESTRICT | CASCADE ]

데이터베이스 역할(Database roles):

REVOKE [ GRANT OPTION FOR ]
    {
       { CREATE SCHEMA | MODIFY | MONITOR | USAGE } [ , ... ] } ON DATABASE <name>
       { <globalPrivileges>         | ALL [ PRIVILEGES ] } ON ACCOUNT
     | { <accountObjectPrivileges>  | ALL [ PRIVILEGES ] } ON { RESOURCE MONITOR | WAREHOUSE | COMPUTE POOL | DATABASE | INTEGRATION | EXTERNAL VOLUME }
     | { <schemaPrivileges>         | ALL [ PRIVILEGES ] } ON { SCHEMA <name>  | ALL SCHEMAS IN DATABASE <db_name>  }
     | { <schemaPrivileges>         | ALL [ PRIVILEGES ] } ON { FUTURE SCHEMAS IN DATABASE <db_name>  }
     | { <schemaObjectPrivileges>   | ALL [ PRIVILEGES ] } ON { <object_name>   | ALL <object_type_plural>  IN SCHEMA <schema_name>  }
     | { <schemaObjectPrivileges>   | ALL [ PRIVILEGES ] } ON FUTURE <object_type_plural>  IN { DATABASE <db_name>  | SCHEMA <schema_name>  }
    }
  FROM DATABASE ROLE <database_role_name>  [ RESTRICT | CASCADE ]

여기서 globalPrivileges, accountObjectPrivileges, schemaPrivileges, schemaObjectPrivileges의 정의는 GRANT <privileges> … TO ROLE 문서와 동일해요:

  • globalPrivileges — CREATE { ACCOUNT | APPLICATION | APPLICATION PACKAGE | COMPUTE POOL | LISTING | DATABASE | EXTERNAL VOLUME | FAILOVER GROUP | INTEGRATION | NETWORK POLICY | ORGANIZATION LISTING | ORGANIZATION PROFILE | PREVIEW APPLICATION | REPLICATION GROUP | ROLE | SHARE | USER | WAREHOUSE }, ATTACH POLICY, AUDIT, BIND SERVICE ENDPOINT, APPLY { ... } POLICY | CONTACT | TAG, EXECUTE { ALERT | DATA METRIC FUNCTION | MANAGED ALERT | MANAGED TASK | TASK }, IMPORT { SHARE | ORGANIZATION LISTING }, MANAGE { ... }, 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, READ UNREDACTED ERROR TABLE, USE AI FUNCTION, USE AI FUNCTIONS.
  • accountObjectPrivileges — 객체 유형별: APPLICATION PACKAGE(ATTACH LISTING | DEVELOP | INSTALL | MANAGE VERSIONS | MANAGE RELEASES), COMPUTE POOL(MODIFY | MONITOR | OPERATE | USAGE), CONNECTION(FAILOVER), DATABASE(APPLYBUDGET | CREATE { DATABASE ROLE | SCHEMA } | IMPORTED PRIVILEGES | MODIFY | MONITOR | USAGE), EXTERNAL VOLUME(USAGE), FAILOVER GROUP(FAILOVER | MODIFY | MONITOR | REPLICATE), INTEGRATION(USAGE | USE_ANY_ROLE), ORGANIZATION PROFILE(MODIFY), REPLICATION GROUP(MODIFY | MONITOR | REPLICATE), RESOURCE MONITOR(MODIFY | MONITOR), USER(IMPERSONATE | MODIFY PROGRAMMATIC AUTHENTICATION METHODS | MONITOR), WAREHOUSE(APPLYBUDGET | MODIFY | MONITOR | USAGE | OPERATE).
  • schemaPrivileges — ADD SEARCH OPTIMIZATION | APPLYBUDGET | CREATE { 다양한 객체 } | MODIFY | MONITOR | USAGE.
  • schemaObjectPrivileges — 객체 유형별 권한 목록(AGENT, ALERT, APPLICATION SERVICE, ARTIFACT REPOSITORY, CONTACT, CORTEX SEARCH SERVICE, DATA METRIC FUNCTION, DATASET/FILE FORMAT/FUNCTION/MODEL/PROCEDURE/SECRET/SEQUENCE/SNAPSHOT/TYPE, SNAPSHOT POLICY/SET, DBT PROJECT, DYNAMIC TABLE, EXPERIMENT, EVENT TABLE, GATEWAY, GIT REPOSITORY, HYBRID TABLE, IMAGE REPOSITORY, ICEBERG TABLE, INTERACTIVE TABLE, MATERIALIZED VIEW, MCP SERVER, ONLINE FEATURE TABLE, PIPE, POLICY/TAG, SECRET, SEMANTIC VIEW, SERVICE, external STAGE, internal STAGE, STREAM, STREAMLIT, TABLE, TAG, TASK, VIEW, WORKSPACE).

필수 파라미터 (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).
  • role_name — 수신 역할(즉 권한이 취소되는 역할)의 식별자를 지정해요.
  • database_role_name — 수신 데이터베이스 역할(즉 권한이 취소되는 역할)의 식별자를 지정해요. 식별자가 db_name.database_role_name 형식으로 정규화되지 않았다면, 명령은 세션의 현재 데이터베이스에서 데이터베이스 역할을 찾아요.

선택 파라미터 (Optional parameters)

  • GRANT OPTION FOR — 지정하면 수신 역할이 권한을 다른 역할에 부여할 수 있는 능력을 제거해요. 기본값: 없음
  • ON FUTURE — 지정하면 기존 객체가 아니라 지정된 유형의 새(즉 미래) 스키마 객체에 부여된 권한만 제거해요. 기존 객체에 부여된 권한은 유지돼요.
  • RESTRICT | CASCADE — 지정하면 권한이 다른 역할에 재부여되었는지 여부를 기준으로 취소 작업이 성공하는지 실패하는지 결정해요.
    • RESTRICT: 취소되는 권한이 다른 역할에 재부여되었으면 REVOKE 명령이 실패해요.
    • CASCADE: 취소되는 권한이 재부여되었으면 REVOKE 명령이 이러한 종속 권한 부여를 재귀적으로 취소해요. 객체의 같은 권한이 다른 grantor(병렬 grant)에 의해 대상 역할에 부여되었다면, 그 grant는 영향받지 않고 대상 역할은 권한을 유지해요.
    • 기본값: RESTRICT

보안 요구사항 (Security requirements)

개별 객체에 권한 취소: 다음 기준 중 하나를 충족하는 활성 역할(또는 더 높은 역할)을 사용하여 객체의 권한을 다른 역할에서 취소할 수 있어요:

  • 역할이 SHOW GRANTS 출력의 GRANTED_BY 열에서 권한의 grantor로 식별되는 경우. 지정된 객체에 권한의 여러 인스턴스가 부여된 경우 활성 grantor 역할이 부여한 인스턴스만 취소돼요.
  • 역할이 전역 MANAGE GRANTS 권한을 가진 경우. 지정된 객체에 권한의 여러 인스턴스가 부여된 경우 모든 인스턴스가 취소돼요. 기본적으로 SECURITYADMIN 시스템 역할 이상만 MANAGE GRANTS 권한을 가지지만 사용자 지정 역할에 부여할 수 있어요.

관리 액세스 스키마(즉 CREATE SCHEMA … WITH MANAGED ACCESS 구문으로 만든 스키마)에서는 스키마 소유자(즉 스키마에 OWNERSHIP 권한이 있는 역할) 또는 전역 MANAGE GRANTS 권한이 있는 역할(또는 더 높은 역할)만 스키마의 객체에 대한 권한을 취소할 수 있어요.

지정된 유형의 미래 객체에 대한 grant 취소:

  • 데이터베이스 수준: 데이터베이스의 미래 객체에 대한 권한을 취소하려면 전역 MANAGE GRANTS 권한이 필요해요. 기본적으로 SECURITYADMIN 시스템 역할 이상만 MANAGE GRANTS 권한을 가지지만 사용자 지정 역할에 부여할 수 있어요.
  • 스키마 수준: 관리 액세스 스키마에서는 스키마 소유자(즉 스키마에 OWNERSHIP 권한이 있는 역할) 또는 전역 MANAGE GRANTS 권한이 있는 역할이 스키마의 미래 객체에 대한 권한을 취소할 수 있어요. 표준 스키마에서는 스키마의 미래 객체에 대한 권한을 취소하려면 전역 MANAGE GRANTS 권한이 필요해요.

사용 메모 (Usage notes)

  • 어떤 클래스에도 직접 권한을 부여하거나 취소할 수 없어요. 그러나 클래스의 인스턴스를 만들고 계정 역할의 인스턴스 역할을 취소할 수 있어요. 역할이 클래스의 인스턴스를 만들지 못하게 하려면 스키마에서 CREATE <class_name> 권한을 취소해요.
  • 권한은 서로 다른 grantor에 의해 역할에 여러 번 부여될 수 있어요. REVOKE <privilege> 문장은 활성 역할 또는 계층 구조의 더 낮은 역할이 grantor인 grant만 취소해요. 다른 grantor의 지정된 권한의 추가 grant는 무시돼요. 또한 REVOKE <privilege> 문장은 취소되는 권한이 없어도 성공해요. REVOKE <privilege> 문장은 지정된 권한에 종속 grant가 있고 문장에 CASCADE 절이 생략된 경우에만 오류를 반환해요.
  • 단일 GRANT 문장에서 같은 객체 유형에 대해 여러 권한을 지정할 수 있고(각 권한은 쉼표로 구분), GRANT 명령을 실행하는 역할이 보유하고 부여할 수 있는 권한만 대상 역할에 실제로 부여돼요. 부여할 수 없는 권한에 대해 경고 메시지가 반환돼요. 태그에는 이 키워드를 지정할 수 없어요.
  • 특정 역할에 부여된 권한은 그 역할이 부여된 다른 역할과 역할 계층 구조 내의 다른 더 높은 수준 역할에 자동으로 상속돼요.
  • 데이터베이스의 경우 IMPORTED PRIVILEGES 권한은 공유 데이터베이스(즉 공유에서 만든 데이터베이스)에만 적용돼요.
  • 스키마와 스키마의 객체의 경우, 컨테이너(즉 데이터베이스 또는 스키마) 내의 같은 유형의 모든 객체에 권한을 부여하는 옵션이 제공돼요. 이는 편의 옵션이며, 내부적으로 명령이 각 객체에 대한 일련의 개별 GRANT 명령으로 확장돼요. 컨테이너 내에 현재 존재하는 객체만 영향을 받아요. 그러나 Snowflake 모델에서 권한의 대량 부여는 권장되지 않아요. 대신 공유 역할을 만들고 그 역할로 객체를 만들어 역할이 부여된 모든 사용자가 자동으로 접근할 수 있게 하는 것이 좋아요.
  • 스테이지의 경우:
    • USAGE는 외부 스테이지에만 적용돼요.
    • READ | WRITE는 내부 스테이지에만 적용돼요. 내부 스테이지에 WRITE 권한을 부여하려면 먼저 스테이지에 READ 권한이 부여되어야 해요.
  • 스토리지 통합의 경우: 스토리지 통합에 의존하는 외부 스테이지를 사용하여 다음 명령을 실행하려면 스토리지 통합에 대한 USAGE 권한이 있거나 상속하는 역할을 사용해야 해요: LIST, REMOVE, COPY INTO , COPY INTO . 역할에서 USAGE 권한을 취소하면 역할은 이 명령을 실행할 수 없어요. 스토리지 통합에 대한 USAGE 권한을 취소해도 역할이 스토리지 통합과 연결된 외부 테이블을 쿼리하는 것을 차단하지 않아요. 외부 테이블을 쿼리하는 데는 기본 스토리지 통합에 대한 USAGE 권한이 필요하지 않아요.
  • 개별 UDF에 권한을 부여할 때 udf_name ( [ arg_data_type , ... ] ) 형태로 UDF의 인자 데이터 유형을 지정해야 해요. Snowflake가 스키마 내에서 같은 이름을 가진 UDF를 인자 데이터 유형으로 해석하기 때문이에요.
  • 개별 저장 프로시저에 권한을 부여할 때 procedure_name ( [ arg_data_type , ... ] ) 형태로 프로시저의 인자 데이터 유형을 지정해야 해요.
  • OWNERSHIP은 future grants를 지원하는 모든 객체 유형에서 유효한 권한이에요.
  • Future grants: future grants를 취소하면 지정된 유형의 미래 객체에 대한 권한 grant만 제거돼요. 기존 객체에 부여된 권한은 유지돼요.
  • 하이브리드 테이블을 만들 권한을 취소하려면 스키마에서 CREATE HYBRID TABLE을 취소해요.
  • 인터랙티브 테이블의 권한을 취소하려면 표준 TABLE 또는 TABLES 키워드를 사용해요. INTERACTIVE TABLE 또는 INTERACTIVE TABLES는 지정할 수 없어요.
  • 예시 (Examples)

    역할 (Roles)

    analyst 역할에서 계정에 웨어하우스를 만들 권한을 취소해요:

    REVOKE CREATE WAREHOUSE ON ACCOUNT FROM ROLE analyst;
    

    analyst 역할에서 report_wh 웨어하우스를 운영(즉 일시 중지 또는 재개)하는 데 필요한 권한을 취소해요:

    REVOKE OPERATE ON WAREHOUSE report_wh FROM ROLE analyst;
    

    analyst 역할에서 report_wh 웨어하우스의 OPERATE 권한에 대한 GRANT OPTION 권한만 취소해요. 역할은 OPERATE 권한을 유지하지만 웨어하우스의 OPERATE 권한을 다른 역할에 부여할 수는 없어요:

    REVOKE GRANT OPTION FOR OPERATE ON WAREHOUSE report_wh FROM ROLE analyst;
    

    analyst 역할에서 mydb.myschema 스키마의 모든 기존 테이블에 대한 SELECT 권한을 취소해요:

    REVOKE SELECT ON ALL TABLES IN SCHEMA mydb.myschema from ROLE analyst;
    

    analyst 역할에서 두 UDF(현재 스키마에서 같은 이름)에 대한 모든 권한을 취소해요:

    REVOKE ALL PRIVILEGES ON FUNCTION add5(number) FROM ROLE analyst;
    
    REVOKE ALL PRIVILEGES ON FUNCTION add5(string) FROM ROLE analyst;
    

    analyst 역할에서 두 저장 프로시저(현재 스키마에서 같은 이름)에 대한 모든 권한을 취소해요:

    REVOKE ALL PRIVILEGES ON PROCEDURE clean_schema(string) FROM ROLE analyst;
    
    REVOKE ALL PRIVILEGES ON procedure clean_schema(string, string) FROM ROLE analyst;
    

    role1 역할에서 mydb.myschema 스키마에 만들어진 모든 미래 테이블에 부여된 SELECT 및 INSERT 권한을 취소해요:

    REVOKE SELECT, INSERT ON FUTURE TABLES IN SCHEMA mydb.myschema
      FROM ROLE role1;
    

    finance 역할에서 mynotebook이라는 노트북의 USAGE 권한을 취소해요:

    REVOKE USAGE ON NOTEBOOK db_one.schema_one.mynotebook FROM ROLE finance;
    

    데이터베이스 역할 (Database roles)

    mydb.dr1 데이터베이스 역할에서 mydb.myschema 스키마의 모든 기존 테이블에 대한 SELECT 권한을 취소해요:

    REVOKE SELECT ON ALL TABLES IN SCHEMA mydb.myschema
      FROM DATABASE ROLE mydb.dr1;
    

    mydb.dr1 데이터베이스 역할에서 두 UDF(현재 스키마에서 같은 이름)에 대한 모든 권한을 취소해요:

    REVOKE ALL PRIVILEGES ON FUNCTION add5(number)
      FROM DATABASE ROLE mydb.dr1;
    
    REVOKE ALL PRIVILEGES ON FUNCTION add5(string)
      FROM DATABASE ROLE mydb.dr1;
    

    mydb.dr1 데이터베이스 역할에서 두 저장 프로시저(현재 스키마에서 같은 이름)에 대한 모든 권한을 취소해요:

    REVOKE ALL PRIVILEGES ON PROCEDURE clean_schema(string)
      FROM DATABASE ROLE mydb.dr1;
    
    REVOKE ALL PRIVILEGES ON procedure clean_schema(string, string)
      FROM DATABASE ROLE mydb.dr1;
    

    mydb.dr1 데이터베이스 역할에서 mydb.myschema 스키마에 만들어진 모든 미래 테이블에 부여된 SELECT 및 INSERT 권한을 취소해요:

    REVOKE SELECT,INSERT ON FUTURE TABLES IN SCHEMA mydb.myschema
      FROM DATABASE ROLE mydb.dr1;
    

    mydb.dr1 데이터베이스 역할에서 노트북의 USAGE 권한을 취소해요:

    REVOKE USAGE ON NOTEBOOK db_one.schema_one.mynotebook
      FROM DATABASE ROLE mydb.dr1;
    

    더 알아보기 (Learn more)