PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 24/11/2015 01:25:54

MadFlo
Membre

Petite fonction qui gère des privilèges et ne veut pas fonctionner

Bonjour,

Je veux écrire une fonction qui donne un certain nombre de privileges à un role donné en entrée.
Ce role est stocké dans une table (format texte pour l'instant) ce qui me permettrait d'appeller la fonction pour tous les lignes de la table ayant certaines propriétés.

Le hic?
La fonction ne marche pas car je n'arrive pas à passer un role en argument / à générer dynamiquement une requête du type

GRANT ... TO <un role passé en agument> ;  

C'est sûrement une histoire de type.

Pour l'instant j'ai.

CREATE OR REPLACE FUNCTION Ouvrir(role text) RETURNS void AS $$
BEGIN
  EXECUTE 'GRANT CONNECT ON DATABASE mabase TO $1' USING role;
  -- lignes similaires pour schema et pour tables.
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

Pour la ligne avec le grant, j'ai aussi essayé :

EXECUTE 'GRANT CONNECT ON DATABASE mabase TO ' || quote_literal(role);

ou encore

EXECUTE 'GRANT CONNECT ON DATABASE mabase TO ' || role;

J'ai des erreurs runtime différentes selon la syntaxe que j'utilise.
Avec USING.

mabase=> SELECT ouvrirEtu('machin');
ERREUR:  erreur de syntaxe sur ou près de « $1 »
LINE 1: GRANT CONNECT ON DATABASE mabase TO $1
                                            ^

Avec quote_literal.

mabase=> SELECT ouvrirEtu('machin');
ERREUR:  erreur de syntaxe sur ou près de « $1 »
LINE 1: GRANT CONNECT ON DATABASE mabase TO 'machin'
                                            ^

ou finalement si je concatène sans rien faire, une erreur où on a l'impression que le role devient NULL, sans que ça pose problème pour les 2 premières lignes de GRANT (base et schéma) mais seulement pour celle sur les tables.

mabase=> SELECT ouvrirEtu('machin');
ERREUR:  erreur de syntaxe à la fin de l'entrée
LINE 1: GRANT SELECT ON TABLE A, B, C TO 
                                        ^

Une idée de ce qui se passe?

Comment manipuler / stocker les roles? Dois je changer le type?

Merci d'avance.

Hors ligne

#2 24/11/2015 09:10:51

gleu
Administrateur

Re : Petite fonction qui gère des privilèges et ne veut pas fonctionner

quote_literal est pour une donnée. Si vous indiquez une chaîne de caractères, ça ajoute donc des guillemets simples en début et fin de ligne. Or GRANT a besoin, non pas d'une chaîne, mais d'un nom d'objet. Donc quote_ident (qui lui ajoutera des guillemets doubles si nécessaire, mais en tout cas pas des guillemets simples).

CREATE OR REPLACE FUNCTION Ouvrir(role text) RETURNS void AS $$
BEGIN
EXECUTE 'GRANT CONNECT ON DATABASE postgres TO '||quote_ident(role);
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

Guillaume.

Hors ligne

#3 24/11/2015 10:33:05

MadFlo
Membre

Re : Petite fonction qui gère des privilèges et ne veut pas fonctionner

Merci gleu et bonne journée,

Hors ligne

Pied de page des forums