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
vautTrue
.Ce n'est pas un super-utilisateur[4], sauf si l'argument
autorise_superuser
vautTrue
.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
ouTRUNCATE
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⚓
nom_schema
est une chaîne de caractères correspondant au nom du schéma dont on cherche le lecteur. Les valeurs denom_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"'.[optionnel]
autorise_public
est un booléen. Par défaut, il vautTrue
, ce qui signifie que le pseudo-rôlepublic
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 valeurFalse
pour 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_login
est 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 valeurTrue
pour 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_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 valeurTrue
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
:
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.