asgard_cherche_lecteur

fonction d'identification du rôle lecteur d'un schéma

z_asgard.asgard_cherche_lecteur(nom_schema text [, autorise_public boolean DEFAULT True [, autorise_login boolean DEFAULT False [, autorise_superuser boolean DEFAULT False]]] )

Indépendamment du rôle qui a pu être renseigné dans le champ lecteur de la table de gestion[1], la fonction asgard_cherche_lecteur examine les privilèges dont disposent les rôles de la base sur le schéma fourni en argument et les objets qui lui sont rattachés. Elle renvoie le rôle le plus susceptible d'être qualifié de lecteur[2] du schéma, ou NULL si aucun rôle ne remplit les conditions minimales qu'elle fixe.

Plus précisément, la fonction considère qu'un rôle est un lecteur potentiel dès lors que :

  • Ce n'est pas le propriétaire du schéma.

  • Ce n'est pas un rôle de connexion[3], sauf si l'argument autorise_login vaut True.

  • Ce n'est pas un super-utilisateur[4], sauf si l'argument autorise_superuser vaut True.

  • Il dispose du privilège USAGE sur le schéma, qui lui permet d'accéder aux objets du schéma.

  • Il ne dispose pas du privilège CREATE sur le schéma, qui lui aurait permis de créer de nouveaux objets rattachés au schéma.

  • Il dispose du privilège SELECT sur strictement plus de la moitié des tables, tables partitionnées, vues, vues matérialisées et tables étrangères du schéma, ce qui lui permet de lire les données qu'elles contiennent.

  • Il ne dispose des privilèges UPDATE, INSERT, DELETE ou TRUNCATE sur aucune des tables, tables partitionnées, vues, vues matérialisées et tables étrangères du schéma, ce qui lui aurait permis d'éditer les données qu'elles contiennent.

Si plusieurs rôles remplissent ces conditions, la fonction renvoie celui qui dispose du privilège SELECT sur le plus grand nombre de tables ou objets assimilés. En cas d'égalité, le rôle renvoyé sera le premier dans l'ordre alphabétique.

Les conditions ci-avant présument que le schéma existe et qu'il contient au moins une table, table partitionnée, vue, vue matérialisée ou table étrangère. Dans le cas contraire, la fonction renverra toujours NULL.

Le pseudo-rôle public est pris en compte, sauf si l'argument autorise_public vaut False.

La fonction ne tient pas compte des privilèges dont les rôles bénéficieraient par héritage d'autres rôles dont ils sont membres. Elle considère uniquement les privilèges qui leur ont été explicitement conférés.

Remarque

Il existe une fonction équivalente pour la recherche du rôle éditeur[5] d'un schéma, asgard_cherche_editeur.

Schéma

z_asgard

La fonction peut être utilisée par tous les utilisateurs.

Syntaxe avec des arguments positionnels

SELECT z_asgard.asgard_cherche_lecteur('%nom_schema' [, %autorise_public [, %autorise_login [, %autorise_superuser ]]]) ;

Les arguments doivent être spécifiés dans l’ordre. Les arguments optionnels peuvent être omis, mais seulement s’ils sont à la fin de la liste.

Syntaxe avec des arguments nommés

SELECT z_asgard.asgard_cherche_lecteur(nom_schema := '%nom_schema' [, autorise_public := %autorise_public [, autorise_login := %autorise_login [, autorise_superuser := %autorise_superuser]]]) ;

L’ordre des arguments nommés n’a pas d’importance. Les arguments optionnels peuvent être omis.

Il est bien entendu possible de commencer avec des arguments positionnels (dans l’ordre) et terminer par des arguments nommés.

Arguments

  1. nom_schema est une chaîne de caractères correspondant au nom du schéma dont on cherche le lecteur. Les valeurs de nom_schema s’écrivent sans les guillemets doubles nécessaires aux identifiants des commandes SQL, même s’il s’agit de noms non normalisés. Par exemple, on veillera bien à indiquer 'c_Bibliothèque' et non '"c_Bibliothèque"'.

  2. [optionnel] autorise_public est un booléen. Par défaut, il vaut True, ce qui signifie que le pseudo-rôle public est inclus dans la recherche, et donc susceptible d'être renvoyé par la fonction s'il dispose des privilèges attendus. Spécifier explicitement la valeur False pour cet argument assure que la fonction ne renverra jamais le pseudo-rôle public, quels que soit ses droits sur le schémas et ses objets.

  3. [optionnel] autorise_login est un booléen. Par défaut, il vaut False, indiquant que les rôles de connexion[3] ne doivent pas être pris en compte dans la recherche. Spécifier explicitement la valeur True pour cet argument autorise la fonction à renvoyer le nom d'un rôle de connexion si les privilèges dont il dispose le justifient.

  4. [optionnel] autorise_superuser est un booléen. Par défaut, il vaut False, ce qui interdit à la fonction de renvoyer le nom d'un rôle super-utilisateur.[4] Il est possible de l'autoriser à inclure les super-utilisateurs dans sa recherche en spécifiant explicitement la valeur True pour cet argument. Reste que, sauf cas exceptionnel, il est peu pertinent de désigner un rôle super-utilisateur comme « lecteur » d'un schéma : même si les seuls privilèges explicites dont il dispose correspondent à des droits de lecture, il a implicitement tous les droits sur les objets de la base et leur contenu.

Résultat

Le nom d'un rôle, sous la forme d'une chaîne de caractères de type text.

La fonction renvoie NULL si aucun rôle ne remplit les conditions requises ou si le schéma n'existe pas.

Exemple

Recherche du lecteur du schéma c_bibliotheque :

1
2
SELECT z_asgard.asgard_cherche_lecteur('c_bibliotheque') ;

Déclaration du rôle le plus susceptible d'être le lecteur du schéma comme rôle lecteur du schéma :

1
2
UPDATE z_asgard.gestion_schema_usr
3
    SET lecteur = z_asgard.asgard_cherche_lecteur(nom_schema)
4
    WHERE nom_schema = 'c_bibliotheque' ;

À noter que cette action peut entraîner la modification des privilèges du rôle considéré. Déclarer un rôle comme lecteur implique en effet de lui conférer les privilèges de l'ancien lecteur s'il y en avait un, ou les privilèges standard pour la fonction de lecteur dans le cas contraire. La fonction asgard_restaure_editeurs_lecteurs offre une alternative s'il importe de conserver les droits tels quels.