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_loginvautTrue.Ce n'est pas un super-utilisateur[4], sauf si l'argument
autorise_superuservautTrue.Il dispose du privilège
USAGEsur le schéma, qui lui permet d'accéder aux objets du schéma.Il ne dispose pas du privilège
CREATEsur le schéma, qui lui aurait permis de créer de nouveaux objets rattachés au schéma.Il dispose du privilège
SELECTsur 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,DELETEouTRUNCATEsur 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⚓
nom_schemaest une chaîne de caractères correspondant au nom du schéma dont on cherche le lecteur. Les valeurs denom_schemas’é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"'.[optionnel]
autorise_publicest un booléen. Par défaut, il vautTrue, ce qui signifie que le pseudo-rôlepublicest inclus dans la recherche, et donc susceptible d'être renvoyé par la fonction s'il dispose des privilèges attendus. Spécifier explicitement la valeurFalsepour cet argument assure que la fonction ne renverra jamais le pseudo-rôlepublic, quels que soit ses droits sur le schémas et ses objets.[optionnel]
autorise_loginest un booléen. Par défaut, il vautFalse, indiquant que les rôles de connexion[3] ne doivent pas être pris en compte dans la recherche. Spécifier explicitement la valeurTruepour cet argument autorise la fonction à renvoyer le nom d'un rôle de connexion si les privilèges dont il dispose le justifient.[optionnel]
autorise_superuserest 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 valeurTruepour 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 :
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 :
UPDATE z_asgard.gestion_schema_usr
SET lecteur = z_asgard.asgard_cherche_lecteur(nom_schema)
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.