类别:

系统函数 (系统信息)

EXPLAIN_PRIVILEGES

返回一个 JSON 字符串,说明执行 SQL 语句需要哪些权限。该函数会分析给定 SQL 语句的授权要求,并以结构化格式返回,其中包含所需的权限、对象类型及对象名称。

另请参阅:

GRANT <privileges> ... TO ROLESHOW GRANTS

语法

EXPLAIN_PRIVILEGES(
  statement => '<sql_statement>'
  [, missing_only => <boolean> ]
  [, for_role => '<role_name>' ])

实参

statement => 'sql_statement'

包含要分析的 SQL 语句的字符串。系统会分析该语句,以确定执行它需要哪些权限。

missing_only => boolean

控制输出模式的布尔值:

  • false – 返回执行该语句所需的所有权限,无论当前用户或指定角色是否已拥有这些权限。

  • true – 仅返回缺失的权限(即当前用户或指定角色目前尚未拥有的权限)。如果存在所有必需的权限,则返回 {"authorized": true}

默认:false

for_role => 'role_name'

要检查其权限的角色的名称。此实参仅在 missing_only => true 时使用。返回该角色(及其被授予的角色)执行此语句所缺失的全部权限。

返回

该函数返回一个 VARCHAR 值,其中包含一个 JSON 对象,以层级结构描述所需的各项权限。JSON 可以包含以下节点类型:

权限节点 – 代表单项权限要求:

{
  "privilege": "<privilege_name>",
  "objectType": "<object_type>",
  "objectName": "<fully_qualified_object_name>"
}
  • privilege – 所需权限的名称(例如 USAGE、SELECT、OWNERSHIP)。特殊值 <ANY> 表示对该对象拥有任意权限即可满足要求。

  • objectType – 对象的类型(例如 DATABASE、TABLE、SCHEMA、ACCOUNT)。

  • objectName – 对象的完全限定名称。

AND 节点 – 需要所有包含的权限:

{
  "allOf": [
    /* ... permissions or nodes */
  ]
}

OR 节点 – 至少需要以下其中一项权限:

{
  "oneOf": [
    /* ... permissions or nodes */
  ]
}

决策节点 – 指示授权状态

{
  "authorized": true
}
  • authorized: true – 存在所有必需的权限。

  • authorized: false – 无法通过授予权限来授权该语句。

访问控制要求

在 SQL 语句中按名称引用该对象时,必须具备相应的权限。通常情况下,只需拥有该对象的任意一项权限即可满足此要求。RESOLVE ALL ON ACCOUNT 权限也符合这一要求。

使用说明

  • statement 实参必须是常量表达式。不能传递列值或其他非常量表达式。

  • 不支持多语句 SQL。该函数仅接受一个 SQL 语句。

  • 某些 SQL 语句不支持权限分析(例如 GRANT、REVOKE、USE ROLE、USE SECONDARY ROLES)。

  • 某些 SQL 语句包含的权限检查不受权限分析功能支持。输出中将省略这些检查。

  • 某些间接权限检查不受权限分析功能支持。输出中将省略这些检查。例如,RESOLVE ALL ON ACCOUNT 并未作为解析数据库的一个选项被包含在内。

  • 当某个对象无法被解析时,该函数会返回一个错误,提示该语句需要访问所有对象。

  • 权限 <ANY> 表示拥有该对象的任意权限即可满足要求(例如,在 USAGE 检查中,OWNERSHIP 也同样符合条件)。

示例

以下示例调用 EXPLAIN_GRANTABLE_PRIVILEGES 函数:

解释 DESC 命令的权限

显示描述架构所需的所有权限:

CALL EXPLAIN_PRIVILEGES(statement => 'DESC SCHEMA mydb.myschema');

输出示例:

{
  "allOf": [
    {
      "privilege": "<ANY>",
      "objectType": "DATABASE",
      "objectName": "MYDB"
    },
    {
      "privilege": "MONITOR",
      "objectType": "SCHEMA",
      "objectName": "MYDB.MYSCHEMA"
    }
  ]
}

此输出表明,您需要数据库 MYDB 的任意权限,AND 架构 MYDB.MYSCHEMAMONITOR 权限。

仅检查缺少的权限

检查当前用户缺少哪些权限:

CALL EXPLAIN_PRIVILEGES(
  statement => 'DROP TABLE mydb.myschema.mytable',
  missing_only => true);

如果您拥有所有必需的权限,则返回:

{
  "authorized": true
}

如果缺少权限,则仅返回缺少的权限:

{
  "allOf": [
    {
      "privilege": "OWNERSHIP",
      "objectType": "TABLE",
      "objectName": "MYDB.MYSCHEMA.MYTABLE"
    }
  ]
}

检查特定角色缺少的权限

检查特定角色缺少哪些权限:

CALL EXPLAIN_PRIVILEGES(
  statement => 'SELECT * FROM mydb.myschema.mytable',
  missing_only => true,
  for_role => 'analyst_role');

用于判断 ``analyst_role``(包括其被授予的角色所拥有的权限)是否具备执行 SELECT 语句所需的必要权限;若不具备,则返回缺失的权限。