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 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 des privilèges INSERT et/ou UPDATE 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

  1. nom_schema est une chaîne de caractères correspondant au nom du schéma dont on cherche l'éditeur. 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 « é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 :

1
2
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 :

1
2
UPDATE z_asgard.gestion_schema_usr
3
    SET editeur = z_asgard.asgard_cherche_editeur(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 é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.