使用引用授予对象的访问权限

引用可用于将对象的访问权限授予存储过程、Snowflake Native App 或类实例,这些主体在默认情况下无权访问这些对象。

简介

引用是可用作标识符的字符串。标识符解析为引用的对象。

引用封装了以下内容:

  • 对象名称。

  • 用于创建对象引用的活动角色和任何活动辅助角色(如果适用)。

  • 创建引用时指定的对象的权限。

可能需要引用的一些场景如下:

  • 所有者的权限存储过程 需要具有访问权限,才能在由不同角色拥有的表中插入数据。

  • 应用程序执行数据分析,并需要对表中的数据具有读取访问权限。

  • SNOWFLAKE.ML.ANOMALY_DETECTION 类的实例需要对用于训练异常检测 ML 模型具有访问权限。

按名称标识的对象

引用 按名称 标识对象。这意味着,如果在创建引用后重命名对象,则引用无效。但是,如果创建同名的新对象,则引用 可能 有效。例如,角色 my_role 为具有 SELECT 权限的表 my_table1 创建引用 my_ref1。创建引用后,将删除表 my_table1 并创建名为 my_table1 的 新 表。引用 my_ref1 使用名称 my_table1 标识表。在本例中,它标识 新 表 my_table1。

如果用于创建引用的角色以及授予的 my_table1 权限仍然有效,则在使用引用时将授予新 my_table1 的访问权限。

如果引用中封装的角色和权限不再有效,则无法授予表 my_table1 的访问权限,并且必须为新表创建新引用。

在执行时验证的权限

在使用引用时,验证向引用创建角色授予的权限。例如,角色 my_role 为具有 SELECT 权限的表 t1 创建引用。如果 my_role 删除或者表 t1 的 SELECT 权限从 my_role 中撤消,则引用中封装的权限不再有效。当引用传递给需要表的 SELECT 权限的存储过程时,存储过程将失败并显示权限错误。

引用类型和引用生命周期

引用的生命周期可以在创建时指定。

  • 瞬态引用 的生命周期有限,无论是在传递引用的调用期间,还是在会话期间。

  • 持久引用 的生命周期无限。引用将保持有效,直到删除了它引用的对象、取消设置引用或引用变为无效。

    有关取消设置引用的示例,请参阅 取消设置应用程序的持久引用。

    由于以下任何原因,引用可能失效:

    • 它引用的对象被重命名。

    • 创建引用的角色被删除。

    • 创建引用的角色不再具有对象的权限。

    有关更多信息,请参阅 按名称标识的对象 和 在执行时验证的权限。

所有者权限存储过程的引用

所有者权限存储过程 使用 所有者 的权限执行,而不是使用 调用方 (执行存储过程)的权限执行。要对调用方有权访问的表、视图或函数执行操作,调用方必须传递对表、视图或函数的引用。借助引用,存储过程能够使用引用创建者(在本例中为调用方)的权限,对引用标识的对象执行操作。

应用程序和类的引用

根据设计,应用程序和类 无 权访问账户(在其中安装应用程序或创建类实例)中的对象。用户可以创建引用,从而向应用程序或类实例授予对象的访问权限。

应用程序和类的提供商和使用者

提供商 创建应用程序,使用者 在使用者账户中安装和使用应用程序。在 Snowflake 类 的案例中,Snowflake 是 提供商,具有 Snowflake 账户并创建类实例的用户是 使用者。

提供商可以创建应用程序和类,在其代码中请求和使用引用。有关更多信息,请参阅 提供商的引用。

使用者可以对他们在账户中创建的应用程序或 Snowflake 类实例,创建并传递引用。有关更多信息,请参阅 使用者的引用。

支持的引用目标

引用的目标可以是对象或查询。如果引用的目标是对象,则引用需要对象的权限。

支持的引用对象类型和权限

下表列出了引用可以包含的对象类型、可以创建的引用类型以及每个对象允许的权限:

对象类型

瞬态

持续

允许的权限

默认权限

API INTEGRATION

✔

USAGE

USAGE

CATALOG INTEGRATION

✔

USAGE

USAGE

COMPUTE POOL

✔

APPLYBUDGET

DATABASE

✔

APPLYBUDGET

EXTERNAL ACCESS INTEGRATION

✔

USAGE

EXTERNAL VOLUME

✔

USAGE

EXTERNAL TABLE

✔

SELECT、REFERENCES

SELECT

FUNCTION

✔

✔

USAGE

USAGE

GIT REPOSITORY

✔

READ

READ

MATERIALIZED VIEW

✔

APPLYBUDGET

PIPE

✔

APPLYBUDGET

APPLYBUDGET

POLICY

✔

MANAGE POLICY

PROCEDURE

✔

✔

USAGE

USAGE

ROW ACCESS POLICY

✔

APPLY

SCHEMA

✔

APPLYBUDGET

SECRET

✔

USAGE、READ

✔

READ

STAGE

✔

READ、WRITE

READ

TABLE

✔

APPLYBUDGET、 REBUILD、 EVOLVESCHEMA

✔

✔

SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES

SELECT

TAG

✔

APPLYBUDGET

TASK

✔

APPLYBUDGET

APPLYBUDGET

VIEW

✔

✔

SELECT、REFERENCES

SELECT

WAREHOUSE

✔

APPLYBUDGET

✔

MODIFY、MONITOR、OPERATE、USAGE

USAGE

查询引用

查询引用 是一种瞬态引用。它引用 SELECT 语句,可用于存储过程中另一个 SQL 语句的 FROM 子句。您可以使用 SYSTEM$QUERY_REFERENCE 函数或 TABLE 关键字创建查询引用。

有关更多信息,请参阅 使用查询引用 和 使用 TABLE 关键字创建对表、视图或查询的引用。

提供商的引用

您可以使用 Snowflake Native App Framework,以提供商的身份创建应用程序。有关向应用程序的使用者请求引用的详细信息,请参阅 向使用者请求引用和对象级权限。

使用者的引用

您可以使用 SYSTEM$REFERENCE 函数创建引用。您可以将函数返回的字符串标识符传递给存储过程、应用程序或类实例。或者,您可以在用于创建引用(代替字符串标识符)的语句中传递。

备注

如果要传递对存储过程的引用,可以使用 TABLE 关键字(而不是调用 SYSTEM$REFERENCE 函数)创建引用。请参阅 使用 TABLE 关键字创建对表、视图或查询的引用。

示例

向具有 SELECT 权限的表 t1,创建具有会话作用域的瞬态引用。

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'SESSION', 'SELECT');

要在引用该表的作用域的生命周期内创建对同一表的引用(例如,如果将其传递给存储过程,则其生命周期将为存储过程最外层块的生命周期),请执行以下语句:

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'CALL', 'SELECT');

向具有 INSERT 权限的表 t1,创建持久引用以传递到应用程序。

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'PERSISTENT', 'INSERT');

创建要传递给存储过程的查询引用。此瞬态引用的生命周期适用于引用传递到的存储过程的最外层块:

SELECT SYSTEM$QUERY_REFERENCE('SELECT id FROM my_table', FALSE);

对于其他示例:

取消设置应用程序的持久引用

需要持久引用的应用程序或类还将提供用于取消设置引用的方法。方法名称可能因实现而异。

或者,您可以使用以下语句取消设置引用:ALTER APPLICATION ...UNSET REFERENCES 语句重命名数据库角色。

  1. 您可以使用 SHOW REFERENCES 命令查看所有引用,包括已为应用程序设置的引用。

    例如,要查看应用程序 my_app 的引用,请执行以下语句:

    SHOW REFERENCES IN APPLICATION my_app;
    
  2. 您可以使用 ALTER APPLICATION 命令取消设置已为应用程序设置的任何引用。

    例如,要取消设置应用程序 my_app 中名为 table_to_read 的引用,请执行以下语句:

    ALTER APPLICATION my_app UNSET REFERENCES('table_to_read');
    

    例如,要取消设置应用程序 my_app 中的所有引用,请执行以下语句:

    ALTER APPLICATION my_app UNSET REFERENCES;
    

使用引用时的注意事项

  • 如果与引用关联的对象被重命名(或重新设置父级),则该引用将不再有效。

    如果创建了同名的新对象,并且引用关联中编码的角色对新对象具有相关权限,则引用仍然有效。否则,它将失败并显示权限错误。

  • 如果交换了对象,并且引用关联中编码的角色对现在具有交换名称的新对象具有相关权限,则引用仍然有效。否则,它将失败并显示权限错误。

  • 对象删除和取消删除:

    • 如果删除了与引用关联的对象,则引用关联将失效。

    • 如果对象取消删除,则引用关联将再次生效。

  • 克隆

    对于使用账户中对象的引用的类实例或其父数据库或架构,您可以进行克隆。

    • 如果引用对象使用完全限定名称引用,则实例克隆引用原始对象。

    • 如果引用对象使用部分限定或非限定名称引用,则实例克隆可能引用克隆对象、原始对象或不引用任何实际对象,具体取决于克隆边界。

  • 对于包含使用者账户中对象引用的类实例的应用程序或数据库,支持复制。

    只要复制以下对象,引用就会在目标账户中正常运行:

    • 应用程序或类实例。

    • 引用的对象。

    • 创建引用的角色。

    这些对象可以在不同的副本或故障转移组中复制。复制所有对象后,引用即可使用。

有关 Snowflake Native App Framework 应用程序的提供商,另请参阅 使用引用时的注意事项。

监控引用的使用情况

您可以使用 SHOW REFERENCES 命令查看应用程序请求的引用。如果已为应用程序设置任何引用,则输出将包括有关对象、数据库、架构以及每个引用的标识符的信息。

例如,要查看应用程序 my_app 中的引用,请执行以下语句:

SHOW REFERENCES IN APPLICATION my_app;