Voilà, la rumeur est confirmée : on change mon vieux disque dur pour un minuscule SSD plus performant. Mon ancien n'était pas encore mort, mais disons que sa vie active tirait à sa fin. Ce qui veut dire que je dois tout réinstaller, sauvegarder mes configurations et préférences : favoris Firefox, comptes FTP de Filezilla, sites de Dreamweaver, etc...
Quand tout a été fait, j'ai reconfiguré mon client PostgreSQL pour poursuivre mon travail sur une application web en cours de développement. Ça n'a pris que quelques minutes pour rencontrer un premier pépin en tentant de modifier une procédure (fonction). J'avais effectué toutes les modifications au corps de la fonction et quand j'ai voulu la sauvegarder, un message est apparu :
ERROR: must be owner of function [ma fonction]
Ce qui veut dire que je ne serais pas en mesure de modifier la fonction car je n'aurais pas les droits ? Hum... Doc de Postgres à la rescousse. Ce que ça dit : lorsqu'on utilise CREATE OR REPLACE FUNCTION, le propriétaire et les permissions ne changent pas. On doit être le propriétaire de la fonction pour pouvoir la remplacer (être membre du rôle propriétaire).
Voyons avec quel utilisateur je suis connecté par le client SQL :
SELECT CURRENT_USERAucune surprise ici, c'est ce que j'avais dans ma configuration. Maintenant, voyons voir qui est le propriétaire de la fonction en question :
SELECT p.proname, u.usenameOups, ça me retourne l'utilisateur postgres. J'en conclus que j'avais initialement créé cette fonction avec le mauvais utilisateur et comme je suis présentement connecté avec le compte spécifique au client, je n'ai pas le droit d'appliquer les changements.
FROM pg_proc as p
INNER JOIN pg_user as u ON p.proowner = u.usesysid
WHERE p.proname = 'nom_de_la_fonction'
Dans l'éditeur, je me suis reconnecté avec l'utilisateur postgres et j'ai pu modifier le owner de la fonction :
ALTER FUNCTION [nom de la fonction] OWNER TO [username]Ici, c'est important d'inclure la signature exacte car sous Postgres, deux fonctions peuvent coexister avec le même nom mais avec un nombre différents de paramètres.
ALTER FUNCTION ma_fonction(integer) OWNER TO code18;Ensuite, j'ai pu sans problème modifier la procédure avec le bon usager. Je ne m'étais jamais rendu compte de mon erreur car mes logins étaient conservés depuis des années à même le client SQL.