GRANT <privileges> … TO ROLE
GRANT <privileges> … TO ROLE
보호 가능한 객체(securable object)에 대한 하나 이상의 접근 권한을 역할 또는 데이터베이스 역할에 부여하는 명령이에요. 부여할 수 있는 권한은 객체별로 다릅니다.
출처: 문서
본문
역할: 역할에 부여할 수 있는 권한은 다음 범주로 그룹화돼요:
- 전역 권한(Global privileges).
- 리소스 모니터, 가상 웨어하우스, 데이터베이스 같은 계정 객체의 권한.
- 스키마의 권한.
- 테이블, 뷰, 스테이지, 파일 형식, UDF, 시퀀스 같은 스키마 객체의 권한.
데이터베이스 역할: 데이터베이스 역할에 부여할 수 있는 권한은 다음 범주로 그룹화돼요:
- 데이터베이스 역할을 포함하는 데이터베이스의 권한.
- 데이터베이스 역할을 포함하는 데이터베이스의 스키마의 권한.
- 데이터베이스 역할을 포함하는 데이터베이스의 테이블, 뷰, 스테이지, 파일 형식, UDF, 시퀀스 같은 스키마 객체의 권한.
구문 (Syntax)
계정 역할(Account roles):
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 | APPLICATION PACKAGE | APPLICATION }
| { <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 { DATABASE <db_name> | SCHEMA <schema_name> } }
| { <schemaObjectPrivileges> | ALL [ PRIVILEGES ] } ON FUTURE <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
TO [ ROLE ] <role_name> [ WITH GRANT OPTION ]
데이터베이스 역할(Database roles):
GRANT { { CREATE SCHEMA | MODIFY | MONITOR | USAGE } [ , ... ] } ON DATABASE <name>
| { <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 { DATABASE <db_name> | SCHEMA <schema_name> } }
| { <schemaObjectPrivileges> | ALL [ PRIVILEGES ] } ON FUTURE <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
TO DATABASE ROLE <database_role_name> [ WITH GRANT OPTION ]
여기서:
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 {
{ AGGREGATION | AUTHENTICATION | JOIN | MASKING | PACKAGES | PASSWORD
| PROJECTION | ROW ACCESS | SESSION | STORAGE LIFECYCLE } POLICY
| CONTACT
| TAG }
| EXECUTE { ALERT | DATA METRIC FUNCTION | MANAGED ALERT | MANAGED TASK | TASK }
| IMPORT { SHARE | ORGANIZATION LISTING }
| MANAGE { ACCOUNT SUPPORT CASES | APPLICATION SPECIFICATIONS | EVENT SHARING | GRANTS | LISTING AUTO FULFILLMENT | ORGANIZATION SUPPORT CASES | SHARE TARGET | USER SUPPORT CASES | VISIBILITY | 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
| READ UNREDACTED ERROR TABLE
| USE AI FUNCTION
| USE AI FUNCTIONS
}
[ , ... ]
accountObjectPrivileges ::=
-- For APPLICATION PACKAGE
{ ATTACH LISTING | DEVELOP | INSTALL | MANAGE VERSIONS | MANAGE RELEASES } [ , ... ]
-- For COMPUTE POOL
{ MODIFY | MONITOR | OPERATE | USAGE } [ , ... ]
-- For CONNECTION
{ FAILOVER } [ , ... ]
-- For DATABASE
{ APPLYBUDGET | CREATE { DATABASE ROLE | SCHEMA }
| IMPORTED PRIVILEGES | MODIFY | MONITOR | USAGE } [ , ... ]
-- For EXTERNAL VOLUME
{ USAGE } [ , ... ]
-- For FAILOVER GROUP
{ FAILOVER | MODIFY | MONITOR | REPLICATE } [ , ... ]
-- For INTEGRATION
{ USAGE | USE_ANY_ROLE } [ , ... ]
-- For ORGANIZATION PROFILE
{ MODIFY } [ , ... ]
-- For REPLICATION GROUP
{ MODIFY | MONITOR | REPLICATE } [ , ... ]
-- For RESOURCE MONITOR
{ MODIFY | MONITOR } [ , ... ]
-- For USER
{ IMPERSONATE | MODIFY PROGRAMMATIC AUTHENTICATION METHODS | MONITOR } [ , ... ]
-- For WAREHOUSE
{ APPLYBUDGET | MODIFY | MONITOR | USAGE | OPERATE } [ , ... ]
schemaPrivileges ::=
ADD SEARCH OPTIMIZATION | APPLYBUDGET
| CREATE {
AGENT | ALERT | APPLICATION SERVICE | ARTIFACT REPOSITORY | CONTACT | CORTEX SEARCH SERVICE | DATA METRIC FUNCTION | DATASET
| DBT PROJECT | EVENT TABLE | EXPERIMENT | FILE FORMAT | FUNCTION
| GATEWAY | { GIT | IMAGE } REPOSITORY | MCP SERVER
| MODEL | NETWORK RULE | NOTEBOOK | PIPE | PROCEDURE
| { AGGREGATION | AUTHENTICATION | MASKING | PACKAGES
| PASSWORD | PRIVACY | PROJECTION | ROW ACCESS | SESSION
| STORAGE LIFECYCLE } POLICY
| SECRET | SEQUENCE | SERVICE | SNAPSHOT | SNAPSHOT POLICY | SNAPSHOT SET
| STAGE | STREAM | STREAMLIT
| SNOWFLAKE.CORE.BUDGET
| SNOWFLAKE.DATA_PRIVACY.CLASSIFICATION_PROFILE
| SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER
| SNOWFLAKE.ML.ANOMALY_DETECTION | SNOWFLAKE.ML.CLASSIFICATION
| SNOWFLAKE.ML.FORECAST | SNOWFLAKE.ML.TOP_INSIGHTS
| SNOWFLAKE.ML.DOCUMENT_INTELLIGENCE
| [ { DYNAMIC | EXTERNAL | HYBRID | ICEBERG | INTERACTIVE | ONLINE FEATURE } ] TABLE
| TAG | TASK | TYPE | WORKSPACE | [ { MATERIALIZED | SEMANTIC } ] VIEW
}
| MODIFY | MONITOR | USAGE
[ , ... ]
schemaObjectPrivileges ::=
-- For AGENT
{ MODIFY | MONITOR | USAGE } [ , ... ]
-- For ALERT
{ MONITOR | OPERATE } [ , ... ]
-- For APPLICATION SERVICE
{ MONITOR | OPERATE | USAGE } [ , ... ]
-- For ARTIFACT REPOSITORY
READ [ , ... ]
-- For CONTACT
{ APPLY | MODIFY } [ , ... ]
-- For CORTEX SEARCH SERVICE
{ OPERATE | USAGE } [ , ... ]
-- For DATA METRIC FUNCTION
USAGE [ , ... ]
-- For DATASET, FILE FORMAT, FUNCTION (UDF or external function), MODEL, PROCEDURE, SECRET, SEQUENCE, SNAPSHOT, or TYPE
USAGE [ , ... ]
-- For SNAPSHOT POLICY or SNAPSHOT SET (for WORM snapshots)
USAGE [ , ... ]
-- For DBT PROJECT
USAGE, MONITOR [ , ... ]
-- For DYNAMIC TABLE
MONITOR, OPERATE, SELECT [ , ... ]
-- For EXPERIMENT
{ CREATE | MODIFY | USAGE } [ , ... ]
-- For EVENT TABLE
{ APPLYBUDGET | DELETE | OWNERSHIP | REFERENCES | SELECT | TRUNCATE } [ , ... ]
-- For GATEWAY
{ CREATE | MODIFY | 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 INTERACTIVE TABLE
{ REFERENCES | SELECT } [ , ... ]
-- For MATERIALIZED VIEW
{ APPLYBUDGET | REFERENCES | SELECT } [ , ... ]
-- For MCP SERVER
{ MODIFY | USAGE } [ , ... ]
-- For ONLINE FEATURE TABLE
{ MONITOR | SELECT } [ , ... ]
-- For PIPE
{ APPLYBUDGET | MONITOR | OPERATE } [ , ... ]
-- For { AGGREGATION | AUTHENTICATION | MASKING | JOIN | PACKAGES | PASSWORD | PRIVACY | PROJECTION | ROW ACCESS | SESSION | STORAGE LIFECYCLE } POLICY or TAG
APPLY [ , ... ]
-- For SECRET
{ READ | USAGE } [ , ... ]
-- For SEMANTIC VIEW
{ SELECT | REFERENCES | MONITOR } [ , ... ]
-- 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 } [ , ... ]
-- For WORKSPACE
{ READ | WRITE } [ , ... ]
필수 파라미터 (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)
- FUTURE — 기존 객체가 아니라 지정된 유형(테이블, 뷰 등)의 새(즉 미래) 데이터베이스 또는 스키마 객체에 권한이 부여됨을 지정해요. future grants는
REVOKE <privileges> … FROM ROLE을 ON FUTURE 파라미터와 함께 사용하여 언제든 취소할 수 있어요. 기존 객체에 부여된 권한은 유지돼요. - WITH GRANT OPTION — 지정하면 수신 역할이 권한을 다른 역할에 부여할 수 있게 해요. 기본값: 없음(수신 역할이 권한을 다른 역할에 부여할 수 없음). 참고: WITH GRANT OPTION 파라미터는 IMPORTED PRIVILEGES 권한을 지원하지 않아요.
사용 메모 (Usage notes)
- 어떤 클래스에 직접 권한을 부여하거나 취소할 수 없어요. 그러나 클래스의 인스턴스를 만들고 인스턴스 역할을 계정 역할에 부여할 수 있어요. 역할이 클래스의 인스턴스를 만들도록 하려면 스키마에
CREATE <class_name>권한을 부여해요. - OWNERSHIP은 future grants를 지원하는 모든 객체 유형에서 유효한 권한이에요.
- 객체(또는 스키마의 지정된 유형의 모든 객체)의 OWNERSHIP 권한을 역할에 부여하여 한 역할에서 다른 역할로 객체 소유권을 이전하려면
GRANT OWNERSHIP을 사용해요.GRANT OWNERSHIP명령은 다른 구문을 가져요. - 단일 GRANT 문장에서 같은 객체 유형에 대해 여러 권한을 지정할 수 있고(각 권한은 쉼표로 구분), 특수
ALL [ PRIVILEGES ]키워드를 사용하여 지정된 객체 유형에 적용 가능한 모든 권한을 부여할 수 있어요. 그러나 GRANT 명령을 실행하는 역할이 보유하고 부여할 수 있는 권한만 대상 역할에 실제로 부여돼요. 부여할 수 없는 권한에 대해 경고 메시지가 반환돼요. 태그에는 이 키워드를 지정할 수 없어요. - 이 키워드는 스키마에 ALL 권한을 부여하려고 해도 클래스에 권한을 부여하지 않아요. 특정 클래스의 인스턴스를 역할이 만들 수 있게 하려면 CREATE 권한을 직접 부여해요(Classes 예시 참조).
- 특정 역할에 부여된 권한은 역할이 부여된 다른 역할과 역할 계층 구조 내의 다른 더 높은 수준 역할에 자동으로 상속돼요.
- 데이터베이스의 경우 IMPORTED PRIVILEGES 권한은 공유 데이터베이스(즉 공유에서 만든 데이터베이스)에만 적용돼요. IMPORTED PRIVILEGES 권한은 데이터베이스 역할에 부여할 수 없어요.
- 스키마와 스키마의 객체의 경우, 컨테이너(즉 데이터베이스 또는 스키마) 내의 같은 유형의 모든 객체에 권한을 부여하는
ALL object_type_plural in container옵션이 제공돼요. 이는 편의 옵션이며, 내부적으로 명령이 각 객체에 대한 일련의 개별 GRANT 명령으로 확장돼요. 컨테이너 내에 현재 존재하는 객체만 영향을 받아요. 그러나 Snowflake 모델에서 권한의 대량 부여는 권장되는 방법이 아니에요. 대신 공유 역할을 만들고 역할로 객체를 만들어 역할이 부여된 모든 사용자가 자동으로 접근할 수 있게 하는 것이 좋아요.ALL TAGS나ALL MASKING POLICIES는 지정할 수 없어요. - 관리 액세스 스키마(managed access schemas)에서:
- 객체에 대한 OWNERSHIP 권한은 스키마 소유자의 하위 역할에만 이전할 수 있어요.
- 스테이지의 경우:
- USAGE는 외부 스테이지에만 적용돼요.
- READ | WRITE는 내부 스테이지에만 적용돼요. 또한 내부 스테이지에 WRITE 권한을 부여하려면 먼저 스테이지에 READ 권한이 부여되어야 해요.
- 개별 UDF나 저장 프로시저에 권한을 부여할 때 인자의 데이터 유형을 다음 구문으로 지정해야 해요:
<function_name>( [ <arg_type> [ , ... ] ] )
Snowflake는 인자 데이터 유형으로 스키마 내에서 같은 이름을 가진 UDF나 저장 프로시저를 해석해요.
- 동적 테이블의 경우 수신 역할은 동적 테이블을 포함하는 데이터베이스와 스키마, 그리고 테이블 새로고침에 사용되는 웨어하우스에 USAGE 권한이 부여되어야 해요.
- 하이브리드 테이블을 만들 권한을 부여하려면 스키마에 CREATE HYBRID TABLE을 부여해요. CREATE TABLE 권한으로는 충분하지 않아요.
- 아티팩트 리포지토리의 경우 future grants가 지원돼요. 예:
GRANT READ ON FUTURE ARTIFACT REPOSITORIES IN SCHEMA mydb.myschema TO ROLE myrole;
아티팩트 리포지토리에 별도로 부여할 수 있는 WRITE 권한은 없어요. 새 패키지 버전 게시에는 OWNERSHIP이 필요해요.
- Application Services의 경우 객체에 대한 어떤 권한(USAGE, OPERATE, MONITOR 또는 OWNERSHIP)이든 DESCRIBE를 허용해요. USAGE, OPERATE, MONITOR 권한은 스키마의 모든 또는 미래 Application Services에 부여될 수 있어요. 예:
GRANT USAGE ON FUTURE APPLICATION SERVICES IN SCHEMA mydb.myschema TO ROLE myrole;
Application Service에 OWNERSHIP을 이전할 수 없고, 개인 데이터베이스의 Application Service에 권한을 부여할 수 없어요.
접근 제어 요구사항 (Access control requirements)
개별 객체에 권한 부여: 일반적으로 다음 권한 집합 중 하나를 가진 역할은 객체에 대한 권한을 다른 역할에 부여할 수 있어요:
- 전역 MANAGE GRANTS 권한. SECURITYADMIN과 ACCOUNTADMIN 시스템 역할만 MANAGE GRANTS 권한을 가지며, 사용자 지정 역할에 부여할 수 있어요.
- 객체에 대한 OWNERSHIP 권한. 스키마 객체(테이블, 뷰 등)에 권한을 부여할 때 역할은 부모 데이터베이스와 스키마에 대한 USAGE 또는 다른 권한도 있어야 해요.
- GRANT
… TO ROLE 문장에 WITH GRANT OPTION 파라미터를 포함하여 권한이 역할에 부여된 경우, 역할은 같은 권한을 다른 역할에 부여할 수 있어요.
관리 액세스 스키마(즉 CREATE SCHEMA … WITH MANAGED ACCESS 구문으로 만든 스키마)에서 객체 소유자는 grant 결정을 내릴 능력을 잃어요. 스키마 소유자(즉 스키마에 OWNERSHIP 권한이 있는 역할) 또는 전역 MANAGE GRANTS 권한이 있는 역할만 스키마의 객체에 권한을 부여할 수 있어요. 전역 MANAGE GRANTS 권한을 가진 역할은 현재(grantor) 역할에 추가 권한을 부여할 수 있어요.
지정된 유형의 미래 객체에 대한 grant 정의:
- 데이터베이스 수준: 데이터베이스의 미래 객체에 권한을 부여하려면 전역 MANAGE GRANTS 권한이 필요해요. SECURITYADMIN과 ACCOUNTADMIN 시스템 역할만 MANAGE GRANTS 권한을 가지며, 사용자 지정 역할에 부여할 수 있어요.
- 스키마 수준: 관리 액세스 스키마에서 스키마 소유자(즉 스키마에 OWNERSHIP 권한이 있는 역할) 또는 전역 MANAGE GRANTS 권한이 있는 역할이 스키마의 미래 객체에 권한을 부여할 수 있어요. 표준 스키마에서는 스키마의 미래 객체에 권한을 부여하려면 전역 MANAGE GRANTS 권한이 필요해요.
- 데이터베이스 역할: SECURITYADMIN 같은 MANAGE GRANTS 권한이 있는 역할이 데이터베이스 역할에 future 권한을 부여하려면 데이터베이스 역할을 포함하는 데이터베이스에 대한 USAGE 권한도 필요해요.
데이터베이스 또는 스키마 객체의 Future grants
이 섹션의 메모는 스키마나 데이터베이스의 객체에 future grants를 할당할 때, 즉 ON FUTURE 파라미터를 사용할 때 적용돼요.
고려 사항 (Considerations)
- 같은 데이터베이스의 데이터베이스와 스키마에 대해 같은 객체 유형의 future grants가 정의되면, 스키마 수준의 grant가 데이터베이스 수준의 grant보다 우선하고 데이터베이스 수준의 grant는 무시돼요. 이 동작은 한 역할 또는 다른 역할에 부여된 미래 객체의 권한에 적용돼요. 예를 들어 다음 문장은 데이터베이스와 스키마 수준에서 같은 유형의 객체에 다른 권한을 부여해요. 데이터베이스 d1의 모든 미래 테이블에 DELETE, INSERT 권한을 역할 r1에 부여해요. 이 grant는 d1의 모든 스키마의 모든 미래 테이블에 접근을 제공해요:
GRANT SELECT ON FUTURE TABLES IN DATABASE d1 TO ROLE r1;
d1.s1 스키마의 모든 미래 테이블에만 INSERT와 DELETE 권한을 역할 r2에 부여해요:
GRANT INSERT, DELETE ON FUTURE TABLES IN SCHEMA d1.s1 TO ROLE r2;
r1 역할에 할당된 future grants는 완전히 무시돼요. d1.s1 스키마에서 새 테이블이 생성되면 r2 역할에 대해 정의된 테이블의 future 권한만 부여돼요.
- 데이터베이스 수준의 future grants는 일반 및 관리 액세스 스키마 모두에 적용돼요.
제한 사항 (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만 구체화돼요.
예시 (Examples)
역할 (Roles)
analyst 역할에 report_wh 웨어하우스를 운영(즉 일시 중지 또는 재개)하는 데 필요한 권한을 부여해요:
GRANT OPERATE ON WAREHOUSE report_wh TO ROLE analyst;
이전 예시를 반복하되, analyst 역할이 권한을 다른 역할에 부여할 수 있게 해요:
GRANT OPERATE ON WAREHOUSE report_wh TO ROLE analyst WITH GRANT OPTION;
mydb.myschema 스키마의 모든 기존 테이블에 SELECT 권한을 analyst 역할에 부여해요:
GRANT SELECT ON ALL TABLES IN SCHEMA mydb.myschema to ROLE analyst;
mydb.myschema 스키마의 두 UDF에 모든 권한을 analyst 역할에 부여해요:
GRANT ALL PRIVILEGES ON FUNCTION mydb.myschema.add5(number) TO ROLE analyst;
GRANT ALL PRIVILEGES ON FUNCTION mydb.myschema.add5(string) TO ROLE analyst;
(UDF들은 다른 인자를 가지며, 이것이 Snowflake가 같은 이름의 UDF를 고유하게 식별하는 방법이에요.)
mydb.myschema 스키마의 저장 프로시저에 USAGE 권한을 analyst 역할에 부여해요:
GRANT USAGE ON PROCEDURE mydb.myschema.myprocedure(number) TO ROLE analyst;
저장 프로시저 이름(UDF 이름과 마찬가지로)은 오버로드될 수 있으므로 인자의 데이터 유형을 지정해야 해요.
mydb.myschema 스키마의 공유 워크스페이스에 WRITE 권한을 analyst 역할에 부여해요:
GRANT WRITE ON WORKSPACE mydb.myschema.my_workspace TO ROLE analyst;
역할에 CREATE PROVISIONED THROUGHPUT 권한을 부여해요:
GRANT CREATE PROVISIONED THROUGHPUT ON ACCOUNT TO ROLE myrole;
지정된 스키마에 하이브리드 테이블을 만들 권한을 부여해요:
GRANT CREATE HYBRID TABLE ON SCHEMA mydb.myschema TO ROLE myrole;
지정된 스키마에 구체화된 뷰를 만들 권한을 부여해요:
GRANT CREATE MATERIALIZED VIEW ON SCHEMA mydb.myschema TO ROLE myrole;
mydb.myschema 스키마에서 만들어진 모든 미래 테이블에 SELECT와 INSERT 권한을 role1 역할에 부여해요:
GRANT SELECT, INSERT ON FUTURE TABLES IN SCHEMA mydb.myschema TO ROLE role1;
mydb 데이터베이스의 모든 미래 스키마에 USAGE 권한을 role1 역할에 부여해요:
USE ROLE ACCOUNTADMIN;
GRANT USAGE ON FUTURE SCHEMAS IN DATABASE mydb TO ROLE role1;
지정된 스키마의 모든 테이블에 ALL PRIVILEGES를 부여해요. 이 grant는 지정된 스키마의 표준 테이블과 하이브리드 테이블 모두에 적용돼요:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA ht_schema TO ROLE ht_role;
데이터베이스 역할 (Database roles)
mydb.myschema 스키마에 데이터베이스 역할 dr1을 만들어요:
CREATE DATABASE ROLE mydb.myschema.dr1;
mydb.myschema 스키마의 모든 기존 테이블에 SELECT 권한을 mydb.dr1 데이터베이스 역할에 부여해요:
GRANT SELECT ON ALL TABLES IN SCHEMA mydb.myschema
TO DATABASE ROLE mydb.dr1;
mydb.myschema 스키마의 두 UDF에 모든 권한을 mydb.dr1 데이터베이스 역할에 부여해요:
GRANT ALL PRIVILEGES ON FUNCTION mydb.myschema.add5(number)
TO DATABASE ROLE mydb.dr1;
GRANT ALL PRIVILEGES ON FUNCTION mydb.myschema.add5(string)
TO DATABASE ROLE mydb.dr1;
mydb.myschema 스키마의 저장 프로시저에 usage 권한을 mydb.dr1 데이터베이스 역할에 부여해요:
GRANT USAGE ON PROCEDURE mydb.myschema.myprocedure(number)
TO DATABASE ROLE mydb.dr1;
지정된 스키마에 구체화된 뷰를 만들 권한을 mydb.dr1 데이터베이스 역할에 부여해요:
GRANT CREATE MATERIALIZED VIEW ON SCHEMA mydb.myschema
TO DATABASE ROLE mydb.dr1;
mydb.myschema 스키마에서 만들어진 모든 미래 테이블에 SELECT와 INSERT 권한을 mydb.dr1 데이터베이스 역할에 부여해요:
GRANT SELECT,INSERT ON FUTURE TABLES IN SCHEMA mydb.myschema
TO DATABASE ROLE mydb.dr1;
mydb 데이터베이스의 모든 미래 스키마에 USAGE 권한을 dr1 역할에 부여해요:
USE ROLE ACCOUNTADMIN;
GRANT USAGE ON FUTURE SCHEMAS IN DATABASE mydb
TO DATABASE ROLE mydb.dr1;
SECURITYADMIN 역할을 사용하여 데이터베이스 역할 mydb.dr1에 future 권한을 부여해요:
USE ROLE ACCOUNTADMIN;
GRANT USAGE ON DATABASE mydb TO ROLE SECURITYADMIN;
USE ROLE SECURITYADMIN;
GRANT SELECT, INSERT ON FUTURE TABLES IN SCHEMA mydb.myschema
TO DATABASE ROLE mydb.dr1;
(SECURITYADMIN 역할은 데이터베이스 역할에 future 권한을 부여하려면 데이터베이스 역할을 포함하는 데이터베이스에 대한 USAGE 권한이 필요해요.)
public 역할과 dr1 데이터베이스 역할이 부여된 testuser 사용자가 mydb.myschema의 새 테이블을 선택하고 삽입할 수 있음을 보여줘요:
USE ROLE ACCOUNTADMIN;
CREATE USER testuser DEFAULT_ROLE=public DEFAULT_SECONDARY_ROLES=all;
CREATE TABLE mydb.myschema.test_table (id INT, name VARCHAR(100));
USE ROLE SECURITYADMIN;
GRANT DATABASE ROLE mydb.dr1 TO USER testuser;
testuser로 로그인했을 때:
INSERT INTO mydb.myschema.test_table (id, name)
VALUES (1, 'Test Record');
SELECT * FROM mydb.myschema.test_table;
예상 출력:
-- +----+-------------+
-- | ID | NAME |
-- +----+-------------+
-- | 1 | Test Record |
-- +----+-------------+
클래스 (Classes)
계정 역할이 스키마에 예산(budgets)을 만들 수 있게 하려면 스키마에 CREATE SNOWFLAKE.CORE.BUDGET 권한을 역할에 부여해요:
USE ROLE ACCOUNTADMIN;
GRANT CREATE SNOWFLAKE.CORE.BUDGET ON SCHEMA budgets_db.budgets_schema
TO ROLE budget_admin;
계정 역할이 스키마에 ML Function 모델이나 인스턴스(forecast, anomaly detection 또는 classification)를 만들 수 있게 하려면 스키마에 적절한 권한을 역할에 부여해요. 다음 권한을 사용할 수 있어요:
- CREATE SNOWFLAKE.ML.ANOMALY_DETECTION
- CREATE SNOWFLAKE.ML.CLASSIFICATION
- CREATE SNOWFLAKE.ML.FORECAST
- CREATE SNOWFLAKE.ML.TOP_INSIGHTS