受限制的调用方的权限¶
可执行文件(如存储过程或 Snowpark Container Services 服务)可以可执行文件所有者(所有者权限)或可执行文件调用方(调用方权限)的权限运行。如果可执行文件以调用方权限运行,则只有当调用方具有在可执行文件上下文之外执行该操作的权限时,可执行文件才能执行该操作。
受限制的调用方权限允许可执行文件以调用方的权限运行,但限制可执行文件以调用方的哪些权限运行。如果是受限制的调用方权限,则可执行文件不能以特定权限运行,除非管理员明确允许。
关于调用方授权¶
管理员使用 调用方授权 定义可执行文件可以使用哪些调用方授权运行。例如,如果调用方拥有表的 SELECT 和 INSERT 权限,但是没有调用方授权允许可执行文件以 INSERT 权限运行,那么具有受限制的调用方授权的可执行文件在对表进行操作时就不能以 INSERT 权限运行。
调用方授权不授予任何权限,而是限制调用方在运行可执行文件时使用哪些现有权限。例如,如果调用方运行存储过程以从表中进行选择,则调用方必须已经拥有表的 SELECT 权限,而且 调用方授权必须允许存储过程以 SELECT 权限运行。
调用方授权由管理员授予 给 拥有可执行文件的角色。调用方授权 针对 的是可执行文件访问的对象(如表和仓库)。当可执行文件尝试访问对象时,调用方授权与可执行文件所有者相关联的权限用于确定哪些调用方的权限可用于操作。
以受限制的调用方权限运行的可执行文件¶
创建可执行文件的用户定义可执行文件是以所有者权限、调用方权限还是受限制的调用方权限运行。如果他们选择受限制的调用方授权,则可执行文件所需的每项权限都必须在授予可执行文件所有者的一个或多个调用方授权中指定。
对于存储过程,EXECUTE AS
参数定义过程是以所有者权限、调用方权限还是受限制的调用方权限运行。以下是定义以受限制的调用方权限运行的过程的示例:
CREATE OR REPLACE PROCEDURE sp_pi()
RETURNS FLOAT NOT NULL
LANGUAGE JAVASCRIPT
EXECUTE AS RESTRICTED CALLER
AS
$$
RETURN 3.1415926;
$$
;
有关以受限制的调用方权限运行的可执行文件的限制列表,请参阅 具有受限制的调用方权限的可执行文件的限制。
授予调用方授权¶
调用方权限 针对 的是可执行文件访问的对象(如表和数据库)。调用方授权授予 给 拥有可执行文件的角色或数据库角色。
管理员用于授予调用方授权的 GRANT 语句具有不同的变化情况,具体取决于您要授予调用方授权的方式。变化情况如下:
GRANT CALLER – 授予特定对象的调用方授权。语句创建的每个调用方授权都允许可执行文件以指定的权限运行。
GRANT ALL CALLER PRIVILEGES – 授予特定对象的调用方授权。语句创建的调用方授权允许可执行文件以调用方的所有权限运行。
GRANT INHERITED CALLER – 当同一类型的所有当前和未来对象共享共同架构、数据库或账户时,授予对上述内容的调用方授权。语句创建的每个调用方授权都允许可执行文件以指定的权限运行。
GRANT ALL INHERITED CALLER PRIVILEGES – 当同一类型的所有当前和未来对象共享共同架构、数据库或账户时,授予对上述内容的调用方授权。语句创建的调用方授权允许可执行文件以调用方的所有权限运行。
单个 GRANT 语句可导致向可执行文件所有者授予多项调用方授权。例如,GRANT CALLER INSERT, SELECT ... 导致两次调用方授权,一次针对 INSERT 权限,另一次针对 SELECT 权限。同样,GRANT ALL INHERITED CALLER PRIVILEGES 语句会使对指定对象类型可以授予的每项权限进行调用方授权。
有关授予调用方授权的完整语法,包括参数,请参阅 GRANT CALLER。
示例¶
以下是管理员如何使用调用方授权来控制可执行文件可以哪些调用方授权运行的例子。
访问 v1
视图的 owner_role
所拥有的可执行文件可以使用对视图的 SELECT 权限运行:
GRANT CALLER SELECT ON VIEW v1 TO owner_role;
访问 db.sch
架构中任何表的 owner_role
所拥有的可执行文件可以使用调用方的 SELECT 和 INSERT 权限运行。
GRANT INHERITED CALLER SELECT, INSERT ON ALL TABLES IN SCHEMA db.sch TO ROLE owner_role;
访问当前账户中架构的 owner_role
所拥有的可执行文件可以使用对架构的所有调用方权限运行。
GRANT ALL INHERITED CALLER PRIVILEGES ON ALL SCHEMAS IN ACCOUNT TO ROLE owner_role;
访问 db.sch1.t1
表的 db.r
数据库角色所拥有的可执行文件可以使用对表的 SELECT 权限运行。
GRANT CALLER SELECT ON TABLE db.sch1.t1 TO DATABASE ROLE db.r;
访问 my_db
数据库的 owner_role
所拥有的可执行文件可以使用对该数据库的所有调用方权限运行。
GRANT ALL CALLER PRIVILEGES ON DATABASE my_db TO ROLE owner_role;
撤销调用方授权¶
管理员使用 REVOKE 语句来撤销先前通过调用方授权授予可执行文件所有者的权限。此语句具有不同的变化情况,具体取决于您要如何撤销调用方授权。
REVOKE CALLER – 撤销特定对象的特定权限。
REVOKE ALL CALLER PRIVILEGES – 撤销特定对象的所有权限。可执行文件在尝试访问对象时将无法以调用方的任何权限运行。
REVOKE INHERITED CALLER – 当同一类型的所有当前和未来对象共享共同架构、数据库或账户时,撤销对上述内容的调用方授权。只有指定列表中的权限会被撤销。
REVOKE ALL INHERITED CALLER PRIVILEGES – 当同一类型的所有当前和未来对象共享共同架构、数据库或账户时,撤销对上述内容的调用方授权。撤销所有权限;可执行文件将无法以调用方的任何权限运行。
执行 REVOKE INHERITED CALLER 或 REVOKE ALL INHERITED CALLER PRIVILEGES 命令不会撤销使用 GRANT CALLER 语句授予账户、数据库或架构内特定对象的调用方授权。例如,如果您直接授予表 my_db.sch1.t1
的调用方授权,则执行 REVOKE INHERITED CALLER SELECT ON ALL TABLES IN DATABASE my_db ...
不会撤销 t1
的调用方授权。
有关撤销调用方授权的完整语法,包括参数,请参阅 REVOKE CALLER。
示例¶
owner_role
拥有的可执行文件在访问当前账户中的视图时,不能再以调用方的权限运行。
REVOKE ALL INHERITED CALLER PRIVILEGES ON ALL VIEWS IN ACCOUNT FROM ROLE owner_role;
owner_role
拥有的可执行文件在访问 db.sch1
架构时不能再以 USAGE 权限运行。
REVOKE CALLER USAGE ON SCHEMA db.sch1 FROM ROLE owner_role;
列出调用方授权¶
用户可以使用 SHOW CALLER GRANTS 命令列出调用方授权。您可以使用此命令列出已授予特定所有者的所有调用方授权 (SHOW CALLER GRANTS TO ... ) 或列出特定对象的所有调用方授权 (SHOW CALLER GRANTS ON ...)。
如果对特定对象执行 SHOW CALLER GRANTS ON ... 命令,则每行可以指示以下任何一项:
直接授予对象调用方授权。
例如,如果管理员执行了
GRANT CALLER SELECT ON TABLE db.sch.t1
,则SHOW CALLER GRANTS ON TABLE db.sch.t1
的输出包含一行。该对象继承了调用方授权。
例如,如果管理员执行了
GRANT INHERITED CALLER SELECT ON ALL TABLES IN SCHEMA db1.sch
,则SHOW CALLER GRANTS ON TABLE db1.sch.t1
的输出包含一行。该对象是用 IN 子句指定的,因此它包含的其他对象继承了调用方授权。
例如,如果管理员执行了
GRANT INHERITED CALLER SELECT ON ALL TABLES IN ACCOUNT
,则SHOW CALLER GRANTS ON ACCOUNT
的输出包含一行。该对象是具有继承的调用方授权的对象的祖先,以及使用导致继承的 IN 子句指定的对象的后代。
例如,如果管理员执行了
GRANT INHERITED CALLER SELECT ON ALL TABLES IN DATABASE my_db
,则SHOW CALLER GRANTS ON SCHEMA my_db.sch1
包含一行。
条件输出¶
SHOW CALLER GRANTS 命令的输出因执行角色的权限而异。当用户执行 SHOW CALLER GRANTS 时,结果只包含他们至少具有一项权限的对象;除非他们能够访问对象,否则他们无法发现该对象的存在,即使针对该对象有调用方授权也是如此。
例如,假设存在数据库 DB1
和 DB2
调用方授权。现在假设角色 R2
具有 DB1
的 USAGE 权限,但针对 DB2
的权限。当 R2
执行 SHOW CALLER GRANTS 时,输出显示存在 DB1
的调用方授权,但未列出 DB2
。如果 R2
有两个数据库的权限,则输出将显示调用方授权针对的是两个数据库。
示例¶
列出已获授的表 t1
调用方授权。
SHOW CALLER GRANTS ON TABLE t1;
列出已获授的当前账户的所有调用方授权。这包括账户 (GRANT CALLER ...ON ACCOUNT) 的直接授权和账户 (GRANT INHERITED CALLER ...IN ACCOUNT) 中所有对象的授权。
SHOW CALLER GRANTS ON ACCOUNT;
列出已授予数据库角色 db.owner_role
的所有调用方授权。
SHOW CALLER GRANTS TO DATABASE ROLE db.owner_role;
对调用方授权的限制¶
调用方授权不会被复制或克隆。
具有受限制的调用方权限的可执行文件的限制¶
如果可执行文件以受限制的调用方权限运行,则它受以下限制约束。
外部暂存区
如未指定存储集成,可执行文件无法创建外部暂存区。
可执行文件无法复制到外部暂存区。
如未指定存储集成,可执行文件无法复制到外部 URL。
存储过程
可执行文件无法创建以所有者权限、调用方权限或受限制的调用方权限运行的 Snowflake 对象。例如,它无法创建存储过程。
可执行文件不能更改存储过程运行的权限。例如,可执行文件不能将存储过程从所有者权限更改为调用方权限。
角色和权限
可执行文件无法执行 USE ROLE 和 USE SECONDARY ROLES 命令。
可执行文件不能使用 GRANT 语句授予权限和调用方授权。
可执行文件不能使用 REVOKE 语句来撤销权限和调用方授权。
引用
可执行文件无法创建瞬态和持久 引用。
与会话相关的操作