Je souhaite stocker l'ID utilisateur dans une variable de session personnalisée et l'utiliser (lire) dans les procédures de déclenchement pour autoriser les actions de l'utilisateur. J'ai trouvé quelque chose comme ça:
set session "myapp.user" = '12345';
...
SELECT current_setting('myapp.user');
et cela semble fonctionner - je pensais que "myapp.user" devrait être déclaré dans le fichier .conf mais il semble que je puisse créer des variables de session à la volée (je n'ai pas changé du tout le fichier .conf).
Y a-t-il un inconvénient à faire comme ça?
Avant la version 9.2, vous deviez ajouter votre variable de classe personnalisée à custom_variable_classes
paramètre dans postgresql.conf
, comme:
custom_variable_classes = 'myapp'
Dans 9.2, cette exigence a été supprimée :
Supprimez le paramètre custom_variable_classes (Tom Lane)
La vérification fournie par ce paramètre était douteuse. Désormais, tout paramètre peut être préfixé par n'importe quel nom de classe.
Donc, depuis 9.2, vous pouvez simplement définir votre variable de classe personnalisée comme vous le faites actuellement, pas besoin de vous soucier de changer postgresql.conf
.
Pour des cas comme celui-ci, j'aime créer une fonction plperl comme celle-ci:
CREATE OR REPLACE FUNCTION session_store(key text,val text DEFAULT NULL)
RETURNS text AS
$BODY$
my ($k,$v)=@_;
die "key cannot be NULL\n" unless defined $k;
if (defined $v) {
$_SHARED{session_store}{$k}=$v;
return undef;
}
return exists $_SHARED{session_store}{$k}?$_SHARED{session_store}{$k}:undef;
$BODY$
LANGUAGE plperl VOLATILE;
L'avantage de cela est qu'il fonctionne également dans les instructions SQL, par exemple:
select session_store('user',12345::text);
insert into mytable(userid) values(session_store('user')::integer);
Si vous avez juste besoin de stocker l'ID utilisateur, voir Comment obtenir l'ID utilisateur du système d'exploitation dans PostgreSQL
C'est assez simple et ne nécessite aucune configuration personnalisée.