9
votes

Identifier un identifiant de connexion dans Postgres

J'ai une base de données Postgres (9) que j'écris un déclencheur pour. Je souhaite que la gâchette définit l'heure de modification et l'ID utilisateur d'un enregistrement. Dans Firebird, vous avez un correspondantsible que vous pouvez utiliser dans une gâchette. Vous pouvez donc ajouter une valeur à une table lorsque vous vous connectez à la base de données (il s'agit d'une application de bureau, les connexions sont donc persistantes pour la durée de vie de l'application), quelque chose comme ceci: xxx

puis recherchez la gâchette que connecté 3775 appartient à UserID 544 et utilisez 544 comme l'utilisateur qui a modifié l'enregistrement.

y a-t-il quelque chose de similaire peut utiliser dans les postgres?


0 commentaires

4 Réponses :


12
votes

Vous pouvez utiliser l'ID de processus. Il peut être récupéré avec: xxx

avec ce PID, vous pouvez également utiliser la table pg_stat_activity pour obtenir plus d'informations sur le backend actuel, Althouht Vous devez déjà savoir tout, puisque vous utilisez ce backend.

ou mieux. Créez simplement une série et récupérez une valeur de celui-ci pour chaque connexion: xxx

puis: xxx dans chaque connexion, pour récupérer une identification unique de connexion.


8 commentaires

Merci Daniel, mais j'ai vérifié cela et cela change pendant la durée de vie de la connexion à la base de données. J'ai besoin de quelque chose qui ne change pas.


Cela ne change pas! Si c'est le cas, vous n'utilisez pas vraiment la même connexion. Vérifiez si vous avez un pool de connexion et vous récupérez accidentellement la connexion!


Merci Daniel, j'utilise EMS Studio pour Postgres et j'ai vérifié cela, et chaque fois que j'ouvre une nouvelle fenêtre de requête, j'ai reçu un nouveau résultat. J'ai fait l'hypothèse que cela a changé par transaction. Peut-être que EMS ouvre une nouvelle connexion pour chaque fenêtre de requête? Je vais construire une application de test avec une connexion que je contrôle et le vérifier là-bas et vous le faire savoir si cela fonctionne.


Votre idée de séquence ne fonctionnera pas, j'ai besoin de quelque chose comme le PID que je peux lire par connexion. Je peux créer une séquence, mais comment puis-je associer que dans la gâchette. Espérons que les œuvres du PID fonctionnent, je vous ferai savoir dès que possible.


pg_backend_pid () (Pas sûr où pg_get_pid () vient de?) Identifier certainement une connexion. Utiliser une connexion par fenêtre de requête sonne très plausible - MSSQL Enterprise Manager, TOad, etc. Travailler de cette façon (par défaut)


Daniel, tandis que votre séquence de création ne fonctionne pas avec le scénario donné, après avoir testé pg_backend_pid (), je peux voir qu'il n'est pas changé au cours de la vie de connexion, et j'avais fait une hypothèse incorrecte basée sur le logiciel que je le testais. Utilisation de pg_backend_pid () dans la manière dont je décris dans mon message est ce que je suis après. Merci à vous et à Araqunid.


Désolé, c'était pg_backend_pid (), je ne sais pas où j'ai lu pg_get_pid ().


Si votre programme client ouvre une nouvelle connexion chaque fois que vous exécutez une requête ... vous obtiendrez une nouvelle PID à chaque fois. Construisez un script et exécutez-le sous forme d'un fichier de transaction / de session avec PSQL -1 -F FileName.SQL DBNameElere et voyez ce qu'il fait.



0
votes

Utilisez actuel_user si Vous avez besoin de l'utilisateur de la base de données (je ne suis pas sûr que c'est ce que vous voulez en lisant votre question).


1 commentaires

Merci pour la suggestion, mais j'utilise le même utilisateur pour toutes les connexions et disposez d'une table utilisateur définie à l'intérieur de la base de données, de sorte que cela ne fonctionnera pas.



3
votes

Bien que cela puisse fonctionner pour votre cas d'utilisation de bureau, notez que les numéros d'identité de processus effectuent le renversement (32768 est une limite supérieure courante), alors utilisez-les comme une clé unique pour identifier un utilisateur peut subir des problèmes. Si vous ne finissez jamais avec des restes de données d'une session précédente dans la table qui suive le suivi des utilisateurs -> Mappage de processus, cela peut entrer en collision avec de nouvelles connexions attribuées au même identifiant de processus une fois qu'il est roulée. Il peut être suffisant pour votre application pour vous assurer de nettoyer agressivement les anciennes entrées de mappage, peut-être au moment du démarrage indiquant comment vous avez décrit son fonctionnement.

Pour éviter ce problème en général, vous devez faire une clé de connexion qui Comprend un bit supplémentaire d'informations, comme lorsque la session a commencé: xxx

qui doit itéralement sur toutes les connexions actives au moment de la calcul, de sorte qu'il ajoute un peu de frais généraux. Il est possible d'exécuter un peu plus efficacement à commencer par PostgreSQL 8.4: xxx

mais cela ne compte vraiment pas si vous avez un grand nombre de connexions actives à la fois.


0 commentaires

6
votes

Un moyen d'utiliser l'option Custom_VariaL_Classes Code> Configuration. Il semble être conçu pour permettre la configuration de modules complémentaires, mais peut également être utilisée pour stocker des valeurs arbitraires dans la session de base de données actuelle.

quelque chose sur les lignes des éléments suivants doit être ajouté à PostgreSQL. Conf code>: p> xxx pré>

Lorsque vous vous connectez à la base de données, vous pouvez stocker quelles que soient les informations requises dans la classe personnalisée, comme: P>

INSERT INTO audit_log VALUES (now(), current_setting('local.userid'), ...)


1 commentaires

Custom_VariaL_Classes n'est plus nécessaire. Voir dba.stackexchange.com/a/29964