GRANT <privileges>¶
向角色或数据库角色授予对安全对象的一项或多项访问权限。可以授予的权限是特定于对象的。
有关向共享授予对安全对象的权限的信息,请参阅 GRANT <privilege> ...TO SHARE。
- 角色:
可以向角色授予的权限分为以下几类:
全局权限。
对资源监视器、虚拟仓库和数据库等账户对象的权限。
对架构的权限。
对表、视图、暂存区、文件格式、UDFs 和序列等架构对象的权限。
- 数据库角色:
可以向数据库角色授予的权限分为以下几类:
对包含数据库角色的数据库的权限。
对包含数据库角色的数据库中架构的权限。
对包含数据库角色的数据库中表、视图、暂存区、文件格式、UDFs 和序列等架构对象的权限。
有关角色和安全对象的更多详细信息,请参阅 访问控制概述。
语法¶
账户角色:
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 } <object_name>
| { schemaPrivileges | ALL [ PRIVILEGES ] } ON { SCHEMA <schema_name> | ALL SCHEMAS IN DATABASE <db_name> }
| { schemaPrivileges | ALL [ PRIVILEGES ] } ON { FUTURE SCHEMAS IN DATABASE <db_name> }
| { schemaObjectPrivileges | ALL [ PRIVILEGES ] } ON { <object_type> <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 ]
数据库角色:
GRANT { { CREATE SCHEMA | MODIFY | MONITOR | USAGE } [ , ... ] } ON DATABASE <object_name>
| { schemaPrivileges | ALL [ PRIVILEGES ] } ON { SCHEMA <schema_name> | ALL SCHEMAS IN DATABASE <db_name> }
| { schemaPrivileges | ALL [ PRIVILEGES ] } ON { FUTURE SCHEMAS IN DATABASE <db_name> }
| { schemaObjectPrivileges | ALL [ PRIVILEGES ] } ON { <object_type> <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 | COMPUTE POOL | DATA EXCHANGE LISTING | DATABASE | FAILOVER GROUP | INTEGRATION
| NETWORK POLICY | EXTERNAL VOLUME | REPLICATION GROUP | ROLE | SHARE
| USER | WAREHOUSE
}
| ATTACH POLICY | AUDIT | BIND SERVICE ENDPOINT
| APPLY {
{ AGGREGATION | AUTHENTICATION | 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 | 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
}
[ , ... ]
accountObjectPrivileges ::=
-- 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 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
| CREATE {
ALERT | FILE FORMAT | FUNCTION | GIT REPOSITORY | IMAGE REPOSITORY | MODEL
| NETWORK RULE | PIPE | PROCEDURE
| { AGGREGATION | AUTHENTICATION | MASKING | PACKAGES
| PASSWORD | PROJECTION | ROW ACCESS | SESSION } POLICY
| SECRET | SEQUENCE | SERVICE | SNAPSHOT | STAGE | STREAM | STREAMLIT
| SNOWFLAKE.CORE.BUDGET
| SNOWFLAKE.ML.ANOMALY_DETECTION | SNOWFLAKE.ML.FORECAST
| [ { DYNAMIC | EXTERNAL | HYBRID | ICEBERG } ] TABLE
| TAG | TASK
| [ MATERIALIZED ] VIEW
}
| MODIFY | MONITOR | USAGE
[ , ... ]
schemaObjectPrivileges ::=
-- For ALERT
{ MONITOR | OPERATE } [ , ... ]
-- For DATA METRIC FUNCTION
USAGE [ , ... ]
-- For DYNAMIC TABLE
MONITOR, OPERATE, SELECT [ , ...]
-- For EVENT TABLE
{ INSERT | SELECT | TRUNCATE } [ , ... ]
-- For FILE FORMAT, FUNCTION (UDF or external function), MODEL, PROCEDURE, SECRET, SEQUENCE, or SNAPSHOT
USAGE [ , ... ]
-- For GIT REPOSITORY
{ READ, WRITE } [ , ... ]
-- For HYBRID TABLE
{ INSERT | SELECT | UPDATE } [ , ... ]
-- For IMAGE REPOSITORY
{ READ, WRITE } [ , ... ]
-- For ICEBERG TABLE
{ APPLYBUDGET | DELETE | INSERT | REFERENCES | SELECT | TRUNCATE | UPDATE } [ , ... ]
-- For PIPE
{ APPLYBUDGET | MONITOR | OPERATE } [ , ... ]
-- For { AGGREGATION | AUTHENTICATION | MASKING | PACKAGES | PASSWORD | PROJECTION | ROW ACCESS | SESSION } POLICY or TAG
APPLY [ , ... ]
-- For SECRET
READ, USAGE [ , ... ]
-- 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 | TRUNCATE | UPDATE } [ , ... ]
-- For TAG
READ
-- For TASK
{ APPLYBUDGET | MONITOR | OPERATE } [ , ... ]
-- For VIEW
{ REFERENCES | SELECT } [ , ... ]
-- For MATERIALIZED VIEW
{ APPLYBUDGET | REFERENCES | SELECT } [ , ... ]
有关每种对象类型支持的权限的更多详细信息,请参阅 访问控制权限。
必填参数¶
object_name
为授予权限的对象指定标识符。
object_type
为架构级对象指定对象的类型。
AGGREGATION POLICY
ALERT
AUTHENTICATION POLICY
DATA METRIC FUNCTION
DYNAMIC TABLE
EVENT TABLE
EXTERNAL TABLE
FILE FORMAT
FUNCTION
GIT REPOSITORY
HYBRID TABLE
IMAGE REPOSITORY
ICEBERG TABLE
MASKING POLICY
MATERIALIZED VIEW
MODEL
NETWORK RULE
PACKAGES POLICY
PASSWORD POLICY
PIPE
PROCEDURE
PROJECTION POLICY
ROW ACCESS POLICY
SECRET
SERVICE
SESSION POLICY
SEQUENCE
SNAPSHOT
STAGE
STREAM
TABLE
TAG
TASK
VIEW
object_type_plural
object_type
的复数形式(例如,TABLES
、VIEWS
)。请注意,不允许对管道进行批量授权。
role_name
指定接收者角色(即权限被授予的角色)的标识符。
database_role_name
指定接收者数据库角色(即权限被授予的角色)的标识符。如果标识符未以
db_name.database_role_name
形式完全限定,则该命令将在会话的当前数据库中查找数据库角色。所有权限仅限于包含数据库角色的数据库以及同一数据库中的其他对象。
可选参数¶
FUTURE
指定授予对指定类型的新(即未来)数据库或架构对象(例如表或视图)的权限,而不是对现有对象的权限。请注意,可以随时使用带有 ON FUTURE 关键字的 REVOKE <privileges> 撤消未来授权;所授予的对现有对象的所有权限都将保留。有关未来授权的更多信息,请参阅本主题内容中的 对数据库或架构对象的未来授权。
WITH GRANT OPTION
如果该参数已指定,则允许接收者角色向其他角色授予权限。
默认:无值,这意味着接收者角色无法向其他角色授予权限。
备注
WITH GRANT OPTION 参数不支持 IMPORTED PRIVILEGES 权限。有关更多信息,请参阅 授予共享数据库的权限。
使用说明¶
不能直接对任何类授予或撤销权限。但是,您可以创建类的实例,并向账户角色授予 实例角色 权限。向架构授予 CREATE <class_name> 权限,使角色能够创建类的实例。
要向角色授予对对象(或架构中指定类型的所有对象)的 OWNERSHIP 权限,将该对象的所有权从一个角色转让到另一个角色,请改用 GRANT OWNERSHIP。GRANT OWNERSHIP 命令具有不同的语法。
可以在单个 GRANT 语句中为同一对象类型指定多个权限(每个权限用逗号分隔),或者可以使用特殊的
ALL [ PRIVILEGES ]
关键字将所有适用的权限授予指定的对象类型。但请注意,实际上只有执行 GRANT 命令的角色所拥有和可授予的权限才会被授予目标角色。对于任何无法授予的权限,将返回一条警告消息。不得为标签指定此关键字。
如果您尝试向架构授予
ALL
权限,则此关键字不会向类授予权限。要允许角色创建特定类的实例,请直接授予 CREATE 权限,如 类 示例中所示。
以下角色会自动继承已授予特定角色的权限:获授予该角色的任何其他角色,以及角色层次结构中任何其他更高级别的角色。有关更多详细信息,请参阅 访问控制概述。
对于数据库,IMPORTED PRIVILEGES 权限仅适用于共享数据库(即从共享创建的数据库)。有关更多详细信息,请参阅 使用共享数据。请注意,无法将 IMPORTED PRIVILEGES 权限授予数据库角色。
对于架构和架构中的对象,提供了一个
ALL object_type_plural in container
选项来授予对容器(即数据库或架构)内所有相同类型对象的权限。这是一个方便的选项;在内部,该命令扩展为针对每个对象的一系列单独 GRANT 命令。只有容器中当前存在的对象会受到影响。但请注意,在 Snowflake 模型中,不建议批量授予权限。相反,Snowflake 建议创建一个共享角色,并使用该角色创建可供所有被授予该角色的用户自动访问的对象。
在托管访问架构中:
对对象的 OWNERSHIP 权限只能转让给架构所有者的下级角色。
对于暂存区:
USAGE 仅适用于外部暂存区。
READ | WRITE 仅适用于内部暂存区。此外,要授予对内部暂存区的 WRITE 权限,必须先授予对暂存区的 READ 权限。
有关外部和内部暂存区的更多详细信息,请参阅 CREATE STAGE。
授予对单个 UDF 或存储过程的权限时,必须使用如下所示的语法指定实参的数据类型(如果有):
<udf_or_stored_procedure_name> ( [ <arg_data_type> [ , ... ] ] )
Snowflake 使用实参数据类型来解析架构中具有相同名称的 UDFs 或存储过程。有关更多信息,请参阅 重载过程和函数。
对于动态表,接收角色必须被授予对包含动态表的数据库和架构以及用于刷新表的仓库的 USAGE 权限。有关更多信息,请参阅 动态表访问控制。
访问控制要求¶
- 授予对单个对象的权限:
通常,具有以下任何一组权限的角色可以将对对象的权限授予其他角色:
全局 MANAGE GRANTS 权限。
只有 SECURITYADMIN 和 ACCOUNTADMIN 系统角色具有 MANAGE GRANTS 权限;但是,可以将该权限授予自定义角色。
对该对象的 OWNERSHIP 权限。授予对架构对象(例如表和视图)的权限时,该角色还必须具有对父数据库和架构的 USAGE 权限。
如果向角色授予权限时使用 WITH GRANT OPTION 参数(该参数包含在 GRANT <privileges> ...TO ROLE 语句中),则该角色可以向其他角色授予相同的权限。
在托管访问架构(即使用 CREATE SCHEMA ...WITH MANAGED ACCESS 语法创建的架构)中,对象所有者无法做出授权决策。仅架构所有者(即拥有对架构的 OWNERSHIP 权限的角色)或具有全局 MANAGE GRANTS 权限的角色可以授予对架构中对象的权限。
请注意,拥有全局 MANAGE GRANTS 权限的角色可以授予当前(授予者)角色附加权限。
- 定义对指定类型的未来对象的授权:
数据库级别
需要全局 MANAGE GRANTS 权限才能授予对数据库中未来对象的权限。只有 SECURITYADMIN 和 ACCOUNTADMIN 系统角色具有 MANAGE GRANTS 权限;但是,可以将该权限授予自定义角色。
架构级别
在托管访问架构(即使用 CREATE SCHEMA ...WITH MANAGED ACCESS 语法创建的架构)中,架构所有者(即拥有对架构的 OWNERSHIP 权限的角色)或具有全局 MANAGE GRANTS 权限的角色可以授予对架构中未来对象的权限。
在标准架构中,需要全局 MANAGE GRANTS 权限才能授予对架构中未来对象的权限。
有关定义对指定类型的未来对象的授权的更多信息,请参阅 对数据库或架构对象的未来授权 (本主题内容)。
对数据库或架构对象的未来授权¶
本节中的说明适用于以下情况:分配对架构或数据库中对象的未来授权;即使用 ON FUTURE 关键字。
有关更多信息,请参阅 托管访问架构。
注意事项¶
当在同一数据库的 同一对象类型 和同一数据库中的架构上定义未来授权时,架构级授权优先于数据库级授权,而数据库级授权被忽略。此行为适用于授予一个角色或不同角色的未来对象的权限。
例如,以下语句在数据库和架构级别对同一类型的对象授予不同的权限。
向角色
r1
授予对数据库d1
中所有未来架构的 SELECT 权限:GRANT SELECT ON FUTURE TABLES IN DATABASE d1 TO ROLE r1;
向角色
r2
授予对d1.s1
架构中所有未来表的 INSERT 和 DELETE 权限。GRANT INSERT,DELETE ON FUTURE TABLES IN SCHEMA d1.s1 TO ROLE r2;
分配给
r1
角色的未来授权将被完全忽略。在架构d1.s1
中创建新表时,仅向r2
角色授予对表定义的未来权限。数据库级未来授权适用于常规和 托管访问架构。
约束与限制¶
最多允许一次对每种安全对象类型的 OWNERSHIP 权限的未来授权。
无法对以下类型的对象定义未来授权:
计算池
外部函数
镜像仓库
策略对象:
聚合策略
掩码策略
包策略
投影策略
行访问策略
会话策略
快照
标签
对数据库中指定类型对象的 OWNERSHIP 权限的未来授权 不 适用于托管访问架构中的新对象。
以下限制适用于对托管访问架构中对象的未来授权:
对对象的 OWNERSHIP 权限的未来授权只能应用于架构所有者的下级角色(即具有对架构的 OWNERSHIP 权限的角色)。
在将托管访问架构的所有权转移给其他角色之前,必须使用 REVOKE <privileges> 和 ON FUTURE 关键字撤消所有未批准的未来授予的 OWNERSHIP 权限。
重命名或交换表时,未来授权不适用。
支持对指定暂存区的未来授权,但有以下限制:
如果没有 READ 权限,则无法指定 WRITE 权限。
如果 READ 权限存在,则无法撤消 WRITE 权限。
对于内部暂存区,只有具有 READ 或 WRITE 权限的未来授权才能物化。
对于外部暂存区,只有具有 USAGE 权限的未来授权才能物化。
示例¶
角色¶
向 analyst
角色授予运行(即暂停或恢复):code:report_wh 仓库所需的权限:
GRANT OPERATE ON WAREHOUSE report_wh TO ROLE analyst;
与前面的示例相同,但也允许 analyst
角色向其他角色授予权限:
GRANT OPERATE ON WAREHOUSE report_wh TO ROLE analyst WITH GRANT OPTION;
向 analyst
角色授予对 mydb.myschema
架构中所有现有表的 SELECT 权限:
GRANT SELECT ON ALL TABLES IN SCHEMA mydb.myschema to ROLE analyst;
向 analyst
角色授予对 mydb.myschema
架构中两个 UDFs 的所有权限:
GRANT ALL PRIVILEGES ON FUNCTION mydb.myschema.add5(number) TO ROLE analyst; GRANT ALL PRIVILEGES ON FUNCTION mydb.myschema.add5(string) TO ROLE analyst;请注意,UDFs 具有不同的实参,这就是 Snowflake 唯一标识具有相同名称的 UDFs 的方式。有关 UDF 命名的更多详细信息,请参阅 用户定义函数概述。
向 analyst
角色授予对 mydb.myschema
架构中存储过程的使用权限:
GRANT USAGE ON PROCEDURE mydb.myschema.myprocedure(number) TO ROLE analyst;请注意,存储过程名称(如 UDF 名称)可能会过载,因此必须指定实参的数据类型。有关名称过载的更多详细信息,请参阅 重载过程和函数。
授予在指定架构中创建物化视图的权限:
GRANT CREATE MATERIALIZED VIEW ON SCHEMA mydb.myschema TO ROLE myrole;
向 role1
角色授予对 mydb.myschema
架构中创建的所有 未来 表的 SELECT 和 INSERT 权限:
GRANT SELECT,INSERT ON FUTURE TABLES IN SCHEMA mydb.myschema TO ROLE role1;
向 role1
角色授予对 mydb
数据库中所有 未来 架构的 USAGE 权限:
use role accountadmin; grant usage on future schemas in database mydb to role role1;
数据库角色¶
向 mydb.dr1
数据库角色授予对 mydb.myschema
架构中所有现有表的 SELECT 权限:
GRANT SELECT ON ALL TABLES IN SCHEMA mydb.myschema TO DATABASE ROLE mydb.dr1;
向 mydb.dr1
数据库角色授予对 mydb.myschema
架构中两个 UDFs 的所有权限:
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;请注意,UDFs 具有不同的实参,这就是 Snowflake 唯一标识具有相同名称的 UDFs 的方式。有关 UDF 命名的更多详细信息,请参阅 用户定义函数概述。
向 mydb.dr1
数据库角色授予对 mydb.myschema
架构中存储过程的使用权限:
GRANT USAGE ON PROCEDURE mydb.myschema.myprocedure(number) TO DATABASE ROLE mydb.dr1;请注意,存储过程名称(如 UDF 名称)可能会过载,因此必须指定实参的数据类型。有关过载存储过程的更多详细信息,请参阅 重载过程和函数。
向 mydb.dr1
数据库角色授予在指定架构中创建物化视图的权限:
GRANT CREATE MATERIALIZED VIEW ON SCHEMA mydb.myschema TO DATABASE ROLE mydb.dr1;
向 mydb.dr1
数据库角色授予对 mydb.myschema
架构中创建的所有 未来 表的 SELECT 和 INSERT 权限:
GRANT SELECT,INSERT ON FUTURE TABLES IN SCHEMA mydb.myschema TO DATABASE ROLE mydb.dr1;
向 role1
角色授予对 mydb
数据库中所有 未来 架构的 USAGE 权限:
USE ROLE ACCOUNTADMIN; GRANT USAGE ON FUTURE SCHEMAS IN DATABASE mydb TO DATABASE ROLE mydb.dr1;
类¶
要允许账户角色在架构中创建预算,请将对架构的 CREATE SNOWFLAKE.CORE.BUDGET 权限授予以下角色:
USE ROLE ACCOUNTADMIN; GRANT CREATE SNOWFLAKE.CORE.BUDGET ON SCHEMA budgets_db.budgets_schema TO ROLE budget_admin;
允许账户角色在架构中创建 Snowflake Cortex ML 函数模型(预测、异常检测或分类),将对架构的适当权限授予角色。以下权限可用。
CREATE SNOWFLAKE.ML.ANOMALY_DETECTION
CREATE SNOWFLAKE.ML.CLASSIFICATION
CREATE SNOWFLAKE.ML.FORECAST