Vous n'êtes pas identifié(e).
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
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
Merci gleu et bonne journée,
Hors ligne