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

#2 PL/pgSQL » Petite fonction qui gère des privilèges et ne veut pas fonctionner » 24/11/2015 01:25:54

MadFlo
Réponses : 2

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.

#4 Re : PL/pgSQL » Récupérer Message dans Exception sur serveur 9.1 » 23/11/2015 12:36:53

Merci edlm.
J'ai testé ça fonctionne.

Je me souviens maintenant de pratique similaire dans le plsql de mysql.

Du coup, c'est quoi l'intérêt dans la nouvelle version d'utiliser la syntaxe
GET STACK etc?

Bonne journée,

#5 PL/pgSQL » Récupérer Message dans Exception sur serveur 9.1 » 21/11/2015 10:27:33

MadFlo
Réponses : 6

Bonjour,

J'ai besoin de récupérer le message d'erreur dans la section exception.
À partir de la version 9.2 la vie est belle et je peux faire par exemple :

EXCEPTION
  WHEN OTHERS THEN
    GET STACKED DIAGNOSTICS mess = MESSAGE_TEXT;
    ...
END;

Je ne suis pas l'administrateur du serveur.
Ce dernier restera encore au moins quelques mois en version 9.1.17

Comment puis-je récupérer le message d'erreur?

Merci d'avance.


PS : je ne peux pas utiliser de log ou autre.
       il s'agit d'un système évaluant les requêtes des étudiants.
       Ces derniers insèrent leur requête dans ma table.
       J'exécute (dans un sandbox) ces requêtes soumises et j'insère les erreurs éventuelles dans une colonne pour que les étudiants puisse soumettre une bonne réponse.

Pied de page des forums

Propulsé par FluxBB