asgard_cherche_editeur
fonction d'identification du rôle éditeur d'un schéma
z_asgard.asgard_cherche_editeur(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 editeur
de la table de gestion[1], la fonction asgard_cherche_editeur
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é d'éditeur[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 éditeur 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 des privilèges
INSERT
et/ouUPDATE
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 d'éditer les données qu'elles contiennent.
Si plusieurs rôles remplissent ces conditions, la fonction renvoie celui qui dispose du privilège INSERT
et/ou UPDATE
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 lecteur[5] d'un schéma, asgard_cherche_lecteur
.
Schéma⚓
z_asgard
La fonction peut être utilisée par tous les utilisateurs.
Syntaxe avec des arguments positionnels⚓
SELECT z_asgard.asgard_cherche_editeur('%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_editeur(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 l'éditeur. 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 « éditeur » d'un schéma : même si les seuls privilèges explicites dont il dispose correspondent à des droits d'édition des données, 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 de l'éditeur du schéma c_bibliotheque
:
SELECT z_asgard.asgard_cherche_editeur('c_bibliotheque') ;
Déclaration du rôle le plus susceptible d'être l'éditeur du schéma comme rôle éditeur du schéma :
UPDATE z_asgard.gestion_schema_usr
SET editeur = z_asgard.asgard_cherche_editeur(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 éditeur implique en effet de lui conférer les privilèges de l'ancien éditeur s'il y en avait un, ou les privilèges standard pour la fonction d'éditeur dans le cas contraire. La fonction asgard_restaure_editeurs_lecteurs
offre une alternative s'il importe de conserver les droits tels quels.