- 类别:
上下文函数 (通用)
SYS_CONTEXT(SNOWFLAKE$SESSION 命名空间)¶
返回有关调用函数的会话的信息。
您可以在以下上下文中调用此函数:
您可以直接在当前会话中调用此函数。
您可以运行调用此函数的调用方权限可执行文件(例如,调用方权限存储过程)。
只要所有者角色已被授予账户上的 READ SESSION 权限,您就可以运行调用此函数的所有者权限可执行文件(例如所有者权限存储过程)。
在任何其他上下文中,该函数返回 NULL。
- 另请参阅:
SYS_CONTEXT、SYS_CONTEXT(SNOWFLAKE$APPLICATION 命名空间)、SYS_CONTEXT(SNOWFLAKE$ENVIRONMENT 命名空间)、SYS_CONTEXT(SNOWFLAKE$ORGANIZATION 命名空间)
语法¶
用来检索属性的语法:
SYS_CONTEXT(
'SNOWFLAKE$SESSION' ,
'<property>'
)
用来调用函数的语法:
SYS_CONTEXT(
'SNOWFLAKE$SESSION' ,
'<function>' , '<argument>' [ , ... ]
)
实参¶
'SNOWFLAKE$SESSION'指定要检索属性或调用函数以返回有关调用该函数的会话的信息。
'property'要检索的属性的名称。您可以指定以下属性:
属性
描述
PRINCIPAL_NAME启动了会话的主体的名称(用户、任务 或 SPCS 服务)。名称取决于
PRINCIPAL_TYPE属性的值:如果
PRINCIPAL_TYPE是以下值之一,PRINCIPAL_NAME属性的值是用户的名称:USERUSER_PERSONUSER_SERVICEUSER_LEGACY_SERVICE
如果
PRINCIPAL_TYPE是TASK,值是任务的名称。如果
PRINCIPAL_TYPE是SNOWSERVICE,值是 SPCS 服务的名称。
PRINCIPAL_TYPE启动会话的主体的类型。此属性可以具有以下值之一:
PRINCIPAL_EMAIL与主体关联的电子邮件地址。如果没有关联的电子邮件地址,则此属性的值为 NULL。
PRINCIPAL_DATABASE包含主体对象的数据库的名称。例如,如果主体是一项任务,则此属性的值是包含该任务的数据库的名称。
如果主体是账户级对象(例如用户),则此属性的值为 NULL。
PRINCIPAL_SCHEMA包含主体对象的架构的名称。例如,如果主体是一项任务,则此属性的值是包含该任务的架构的名称。
如果主体是账户级对象(例如用户),则此属性的值为 NULL。
ID调用函数的会话的标识符。
ROLE调用函数的会话的主要角色。
ROLE_TYPE主要角色的类型。此属性可以具有以下值之一:
如果主要角色是账户角色,则为
ROLE。
ROLE_DATABASE如果角色是数据库角色,则为包含该数据库角色的数据库名称。
SECONDARY_ROLES会话中作为次要角色激活的账户级角色的 JSON 数组。激活的角色包括层级结构上位于所请求角色之下的角色。例如,假设用户执行了以下操作:
USE SECONDARY ROLES ACCOUNTADMIN;
此属性的 JSON 数组包含 ACCOUNTADMIN 角色,以及位于 ACCOUNTADMIN 角色之下的 SECURITYADMIN、SYSADMIN 和 USERADMIN 角色。
WANTED_SECONDARY_ROLES用户请求的账户级角色的 JSON 数组。例如,假设用户执行了以下操作:
USE SECONDARY ROLES ACCOUNTADMIN;
的此属性的 JSON 数组仅包含 ACCOUNTADMIN 角色。
DATABASE会话使用的当前数据库(如果调用该函数的角色具有访问数据库的权限)。
SCHEMA会话使用的当前架构(如果调用函数的角色具有访问架构的权限)。
SCHEMAS会话架构的当前 :ref:`搜索路径 <label-object_name_resolution_search_path>`(如果调用该函数的角色具有访问当前数据库的权限)。
WAREHOUSE会话当前使用的仓库。
'function'要调用的函数的名称。您可以调用以下函数:
'argument' [ , ... ]要传递给要调用的函数的实参。
返回¶
该函数会返回 VARCHAR 值或 NULL:
使用说明¶
如果您在 Shell 的双引号字符串中指定函数调用,请使用反斜杠 (
\) 转义$字符,以免$SESSION被解释为 Shell 变量。例如,如果您使用的是 Snowflake CLI,并且您 指定 SQL 语句作为命令行实参 放在双引号里:
snow sql --query "SELECT SYS_CONTEXT('SNOWFLAKE\$SESSION', 'PRINCIPAL_NAME');"
示例¶
以下示例演示如何检索有关会话的上下文信息:
检索有关主体的信息¶
以下示例返回调用该函数的主体的名称和类型:
SELECT SYS_CONTEXT('SNOWFLAKE$SESSION', 'PRINCIPAL_NAME') AS name,
SYS_CONTEXT('SNOWFLAKE$SESSION', 'PRINCIPAL_TYPE') AS type,
SYS_CONTEXT('SNOWFLAKE$SESSION', 'PRINCIPAL_EMAIL') AS email;
+--------------+-------------+---------------------+
| NAME | TYPE | EMAIL |
|--------------+-------------+---------------------|
| MY_USER_NAME | USER_PERSON | my.user@example.com |
+--------------+-------------+---------------------+
检索有关角色的信息¶
以下示例返回调用函数的会话中主要角色的名称和类型:
SELECT SYS_CONTEXT('SNOWFLAKE$SESSION', 'ROLE') AS role,
SYS_CONTEXT('SNOWFLAKE$SESSION', 'ROLE_TYPE') AS type;
+---------+------+
| ROLE | TYPE |
|---------+------|
| MY_ROLE | ROLE |
+---------+------+
以下示例使用 ACCOUNTADMIN 角色作为次要角色。该示例随后返回会话中请求的次要角色列表 (ACCOUNTADMIN) 以及作为会话次要角色激活的账户级角色列表。
已激活角色列表包含层级结构上位于所请求角色之下的角色。因为激活 ACCOUTADMIN 角色后,列表包括 SECURITYADMIN、SYSADMIN 和 USERADMIN,它们位于 ACCOUNTADMIN 角色下。
USE SECONDARY ROLES ACCOUNTADMIN;
SELECT SYS_CONTEXT('SNOWFLAKE$SESSION', 'WANTED_SECONDARY_ROLES') AS requested_roles,
SYS_CONTEXT('SNOWFLAKE$SESSION', 'SECONDARY_ROLES') AS requested_roles_with_child_roles;
+------------------+---------------------------------------------------------+
| REQUESTED_ROLES | REQUESTED_ROLES_WITH_CHILD_ROLES |
|------------------+---------------------------------------------------------|
| ["ACCOUNTADMIN"] | ["ACCOUNTADMIN","SECURITYADMIN","SYSADMIN","USERADMIN"] |
+------------------+---------------------------------------------------------+
检索当前数据库、架构、搜索路径和仓库¶
以下示例返回会话使用的当前数据库、架构和仓库:
SELECT SYS_CONTEXT('SNOWFLAKE$SESSION', 'DATABASE') AS database,
SYS_CONTEXT('SNOWFLAKE$SESSION', 'SCHEMA') AS schema,
SYS_CONTEXT('SNOWFLAKE$SESSION', 'WAREHOUSE') AS warehouse;
+----------+--------+--------------+
| DATABASE | SCHEMA | WAREHOUSE |
|----------+--------+--------------|
| MY_DB | PUBLIC | MY_WAREHOUSE |
+----------+--------+--------------+
以下示例返回包含会话搜索路径的 JSON 数组:
SELECT SYS_CONTEXT('SNOWFLAKE$SESSION', 'SCHEMAS');
+---------------------------------------------+
| SYS_CONTEXT('SNOWFLAKE$SESSION', 'SCHEMAS') |
|---------------------------------------------|
| ["MY_DB.MY_SCHEMA","MY_DB.PUBLIC"] |
+---------------------------------------------+
以下示例为搜索路径中的每个元素返回一行:
SELECT value::VARCHAR AS path_element
FROM TABLE(
FLATTEN(INPUT => PARSE_JSON(SYS_CONTEXT('SNOWFLAKE$SESSION', 'SCHEMAS'))));
+-----------------------+
| PATH_ELEMENT |
|-----------------------|
| BOOKS_DB.BOOKS_SCHEMA |
| BOOKS_DB.PUBLIC |
+-----------------------+