访问控制问题故障排除

如果因为用于运行查询的角色缺乏所需的访问控制权限导致 SQL 语句失败,您可以使用 EXPLAIN_PRIVILEGES 函数来精确确定缺少哪些权限。

以管理员身份进行故障排除

拥有 Snowflake 中所有对象权限的管理员可以对任意 SQL 语句调用 EXPLAIN_PRIVILEGES 函数。

小技巧

如果您希望没有对象权限的用户也能够使用 EXPLAIN_PRIVILEGES 来诊断访问控制问题,请授予他们 RESOLVE ALL ON ACCOUNT 权限。

示例:列出运行 SQL 语句所需的所有权限

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 权限。

示例:列出特定角色缺少的权限

以下调用确定 ``analyst_role``(包括其授予角色的权限)是否具有执行 SELECT 语句所需的权限,如果没有,则返回缺少的权限。

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

对自己的查询进行故障排除

您必须至少对查询中引用的对象拥有一项权限,才能调用 EXPLAIN_PRIVILEGES 函数。如果对象的这些权限不足以成功运行查询,可以调用 EXPLAIN_PRIVILEGES 函数,并将 missing_only 实参设置为 true,以确定所需的其他权限。

例如,如果您拥有 mydbmyschemamytable 对象的权限,但仍然由于访问控制问题导致查询失败,请运行以下命令:

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

如果当前角色缺少权限,该函数将返回您所需的具体权限。例如:

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