Categorias:

Funções do sistema (Informações do sistema)

EXPLAIN_PRIVILEGES

Retorna uma cadeia de caracteres JSON que explica quais privilégios são necessários para executar uma instrução SQL. Essa função analisa os requisitos de autorização para uma determinada instrução SQL e os retorna em um formato estruturado, mostrando os tipos de objeto, os nomes dos objetos e os privilégios necessários.

Consulte também:

GRANT <privilégios> … TO ROLE, SHOW GRANTS

Sintaxe

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

Argumentos

statement => 'sql_statement'

Uma cadeia de caracteres contendo a instrução SQL a ser analisada. A instrução é analisada para determinar quais privilégios são necessários para executá-la.

missing_only => boolean

Valor booleano que controla o modo de saída:

  • false – retorna todos os privilégios necessários para executar a instrução, independentemente de o usuário atual ou a função especificada os ter.

  • true – retorna apenas os privilégios que estão faltando (não atribuídos atualmente ao usuário atual ou à função especificada). Se todos os privilégios necessários estiverem presentes, retornará {"authorized": true}.

Padrão: false

for_role => 'role_name'

O nome de uma função para a qual os privilégios serão verificados. Esse argumento é utilizado somente quando missing_only => true. Retorna todos os privilégios ausentes para a função (e as funções concedidas) executar a instrução.

Retornos

A função retorna um valor VARCHAR contendo um objeto JSON que descreve os privilégios necessários em uma estrutura hierárquica. O JSON pode conter os seguintes tipos de nó:

Nó de Permissão – representa um único requisito de privilégio:

{
  "privilege": "<privilege_name>",
  "objectType": "<object_type>",
  "objectName": "<fully_qualified_object_name>"
}
  • privilege — o nome do privilégio necessário (por exemplo, USAGE, SELECT, OWNERSHIP). O valor especial <ANY> indica que qualquer privilégio no objeto é suficiente.

  • objectType – o tipo de objeto (por exemplo, DATABASE, TABLE, SCHEMA, ACCOUNT).

  • objectName – o nome totalmente qualificado do objeto.

Nó AND – todos os privilégios contidos são necessários:

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

Nó OR – pelo menos um dos privilégios contidos é necessário:

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

Nó de decisão – indica o status de autorização

{
  "authorized": true
}
  • authorized: true – todos os privilégios necessários estão presentes.

  • authorized: false – a declaração não pode ser autorizada com concessões de privilégio.

Requisitos de controle de acesso

Você deve ter privilégios para se referir ao objeto pelo nome na instrução SQL. Na maioria das vezes, esse requisito é atendido tendo pelo menos um privilégio no objeto. O privilégio RESOLVE ALL ON ACCOUNT também atende a esse requisito.

Notas de uso

  • O argumento statement deve ser uma expressão constante. Não é possível passar valores de coluna ou outras expressões que não sejam de constantes.

  • Instruções SQL com múltiplas declarações não são compatíveis. A função aceita apenas uma única instrução SQL.

  • Algumas instruções SQL não são compatíveis com a análise de privilégios (por exemplo, GRANT, REVOKE, USE ROLE, USE SECONDARY ROLES).

  • Algumas instruções SQL têm verificações de privilégios que não são compatíveis com a análise de privilégios. Essas verificações serão omitidas da saída.

  • Algumas verificações de privilégios indiretas não são compatíveis com a análise de privilégios. Essas verificações serão omitidas da saída. Por exemplo, RESOLVE ALL ON ACCOUNT não está incluído como uma opção para resolver um banco de dados.

  • Quando não é possível resolver um objeto, a função retorna um erro indicando que a instrução requer acesso a todos os objetos.

  • O privilégio <ANY> significa que qualquer privilégio no objeto é suficiente (por exemplo, para USAGE verifica onde OWNERSHIP também seria suficiente).

Exemplos

Os exemplos a seguir chamam a função EXPLAIN_GRANTABLE_PRIVILEGES:

Explicar privilégios para um comando DESC

Mostrar todos os privilégios necessários para descrever um esquema:

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

Exemplo de saída:

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

Essa saída indica que você precisa de um privilégio no banco de dados MYDB AND do privilégio MONITOR no esquema MYDB.MYSCHEMA.

Verificar somente os privilégios ausentes

Verificar quais privilégios estão faltando para o usuário atual:

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

Se você tiver todos os privilégios necessários, retornará:

{
  "authorized": true
}

Se estiverem faltando privilégios, retornará apenas os que estão ausentes:

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

Verificar privilégios ausentes para uma função específica

Verificar quais privilégios faltam em uma função específica:

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

Determina se o analyst_role (incluindo privilégios das funções concedidas) tem os privilégios necessários para executar a instrução SELECT e, caso contrário, retorna os privilégios ausentes.