Solução de problemas de controle de acesso

Se uma instrução SQL falhar porque a função que está sendo usada para executar a consulta não tem os privilégios de controle de acesso necessários, você pode usar a função EXPLAIN_PRIVILEGES para determinar exatamente quais privilégios estão faltando.

Solução de problemas como administrador

Um administrador que tem privilégios em todos os objetos no Snowflake pode chamar a função EXPLAIN_PRIVILEGES em qualquer instrução SQL.

Dica

Se você quiser que alguém sem privilégios nos objetos possa diagnosticar problemas de controle de acesso usando EXPLAIN_PRIVILEGES, conceda a essa pessoa o privilégio RESOLVE ALL ON ACCOUNT.

Exemplo: listar todos os privilégios necessários para executar uma instrução SQL

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.

Exemplo: listar os privilégios ausentes para uma função específica

A chamada a seguir determina se analyst_role (incluindo os privilégios das respectivas funções concedidas) tem os privilégios necessários para executar a instrução SELECT e, em caso negativo, retorna os privilégios ausentes.

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

Solução de problemas da própria consulta

Você deve ter pelo menos um privilégio nos objetos referenciados em sua consulta para chamar a função EXPLAIN_PRIVILEGES. Se esses privilégios no objeto não forem suficientes para executar sua consulta com sucesso, chame a função EXPLAIN_PRIVILEGES com o argumento missing_only definido como true para determinar os privilégios adicionais necessários.

Por exemplo, se você tem privilégios nos objetos mydb, myschema e mytable, mas ainda há falha na sua consulta devido a problemas de controle de acesso, execute o seguinte comando:

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

Se faltarem privilégios em sua função atual, a função retornará os privilégios específicos de que você precisa. Por exemplo:

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