Catégories :

Fonctions système (Informations système)

EXPLAIN_PRIVILEGES

Renvoie une chaîne JSON qui explique quels privilèges sont nécessaires pour exécuter une instruction SQL. Cette fonction analyse les exigences d’autorisation pour une instruction SQL donnée et les renvoie dans un format structuré montrant les privilèges requis, les types d’objets et les noms d’objets.

Voir aussi :

GRANT <privilèges> … TO ROLE, SHOW GRANTS

Syntaxe

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

Arguments

statement => 'sql_statement'

Une chaîne contenant l’instruction SQL à analyser. L’instruction est analysée pour déterminer quels privilèges sont nécessaires pour l’exécuter.

missing_only => boolean

Valeur booléenne qui contrôle le mode de sortie :

  • false - Renvoie tous les privilèges requis pour exécuter l’instruction, que l’utilisateur actuel ou le rôle spécifié les possède ou non.

  • true - Renvoie uniquement les privilèges manquants (qui ne sont pas actuellement détenus par l’utilisateur actuel ou le rôle spécifié). Si tous les privilèges requis sont présents, renvoie``{« authorized »: true}``.

Par défaut : false

for_role => 'role_name'

Le nom d’un rôle pour lequel vérifier les privilèges. Cet argument n’est utilisé que lorsque missing_only => true. Renvoie tous les privilèges manquants pour le rôle (et les rôles qui lui sont attribués) pour exécuter l’instruction.

Renvoie

La fonction renvoie une valeur VARCHAR contenant un objet JSON qui décrit les privilèges requis dans une structure hiérarchique. L’objet JSON peut contenir les types de nœuds suivants :

Node de permission - Représente une exigence de privilège unique :

{
  "privilege": "<privilege_name>",
  "objectType": "<object_type>",
  "objectName": "<fully_qualified_object_name>"
}
  • privilege - Nom du privilège requis (par exemple, USAGE, SELECT, OWNERSHIP). La valeur spéciale <ANY> indique que tout privilège sur l’objet est suffisant.

  • objectType - Le type d’objet (par exemple, DATABASE, TABLE, SCHEMA, ACCOUNT).

  • objectName - Nom complet de l’objet.

Nœud AND - Tous les privilèges contenus sont requis :

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

**Nœud OR ** — Au moins un des privilèges contenus est requis :

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

Nœud de décision - Indique le statut d’autorisation

{
  "authorized": true
}
  • authorized: true - Tous les privilèges requis sont présents.

  • authorized: false - L’instruction ne peut pas être autorisée avec des privilèges.

Exigences en matière de contrôle d’accès

Vous devez disposer des privilèges pour faire référence à l’objet par son nom dans l’instruction SQL. Le plus souvent, cette exigence est satisfaite en disposant d’au moins un privilège sur l’objet. Le privilège RESOLVE ALL ON ACCOUNT répond également à cette exigence.

Notes sur l’utilisation

  • L’argument statement doit être une expression constante. Vous ne pouvez pas transmettre de valeurs de colonnes ni d’autres expressions non constantes.

  • Le SQL multi-instructions n’est pas pris en charge. La fonction accepte une seule instruction SQL.

  • Certaines instructions SQL ne sont pas prises en charge pour l’analyse des privilèges (par exemple,GRANT, REVOKE, USE ROLE, USE SECONDARY ROLES).

  • Certaines instructions SQL comportent des contrôles de privilèges qui ne sont pas pris en charge pour l’analyse des privilèges. Ces contrôles seront omis dans la sortie.

  • Certains contrôles de privilège indirects ne sont pas pris en charge pour l’analyse des privilèges. Ces contrôles seront omis dans la sortie. Par exemple, RESOLVE ALL ON ACCOUNT n’est pas inclus en tant qu’option pour résoudre une base de données.

  • Lorsqu’un objet ne peut pas être résolu, la fonction renvoie une erreur indiquant que l’instruction nécessite un accès à tous les objets.

  • Le privilège <ANY> signifie que tout privilège sur l’objet est suffisant (par exemple, pour les contrôles USAGE où OWNERSHIP suffirait également).

Exemples

Les exemples suivants appellent la fonction EXPLAIN_GRANTABLE_PRIVILEGES :

Expliquer les privilèges d’une commande DESC

Afficher tous les privilèges requis pour décrire un schéma :

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

Exemple de sortie :

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

Cette sortie indique que vous avez besoin d’un privilège quelconque sur la base de données``MYDB`` ET le privilège MONITOR sur le schéma MYDB.MYSCHEMA.

Vérifier uniquement les privilèges manquants

Vérifiez les privilèges manquants pour l’utilisateur actuel :

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

Si vous avez tous les privilèges requis, renvoie :

{
  "authorized": true
}

S’il vous manque des privilèges, renvoie uniquement les manquants :

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

Vérifier les privilèges manquants pour un rôle spécifique

Vérifier les privilèges manquants à un rôle spécifique :

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

Détermine si le rôle analyst_role (y compris les privilèges des rôles qui lui sont attribués) possède les privilèges nécessaires pour exécuter l’instruction SELECT et, si ce n’est pas le cas, renvoie les privilèges manquants.