PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

sécurité des threads postgresql pour les tables temporaires

Les tables temporaires sont visibles pour toutes les opérations de la même session. Donc, vous ne pouvez pas créer une table temporaire du même nom dans la même session avant de supprimer celle qui existe (validez la transaction dans votre cas).

Vous voudrez peut-être utiliser :

CREATE TEMP TABLE tmptbl IF NOT EXISTS ...

En savoir plus sur CREATE TABLE dans le manuel.

Tables temporaires uniques

Pour rendre la table temporaire locale par "thread" (dans la même session), vous devez utiliser des noms de table uniques . Une façon serait d'utiliser une SEQUENCE non liée et SQL dynamique - dans un langage procédural comme plpgsql ou dans une instruction DO (qui est fondamentalement la même sans stocker de fonction.

Exécutez-en un :

CREATE SEQUENCE myseq;

Utiliser :

DO $$
BEGIN
EXECUTE 'CREATE TABLE tmp' || nextval('myseq')  ||'(id int)';
END;
$$

Pour connaître le dernier nom de table :

SELECT 'tmp' || currval('myseq');

Ou mettez tout cela dans une fonction plpgsql et renvoyez la table ou réutilisez le nom de la table.

Cependant, toutes les autres commandes SQL doivent être exécutées dynamiquement, car les instructions SQL simples fonctionnent avec des identifiants codés en dur. Donc, il est probablement préférable de tout mettre dans une fonction plpgsql.

ID unique pour utiliser la même table temporaire

Une autre solution possible pourrait être d'utiliser la même table temporaire pour tous les threads de la même session et ajoutez une colonne thread_id à la table. Assurez-vous d'indexer la colonne, si vous faites un usage intensif de la fonctionnalité. Utilisez ensuite un thread_id unique par thread (dans la même session).

Une seule fois :

CREATE SEQUENCE myseq;

Une fois par thread :

CREATE TEMP TABLE tmptbl(thread_id int, col1 int) IF NOT EXISTS;
my_id :=  nextval('myseq'); -- in plpgsql
-- else find another way to assign unique id per thread

SQL :

INSERT INTO tmptbl(thread_id, col1) VALUES
(my_id, 2), (my_id, 3), (my_id, 4);

SELECT * FROM tmptbl WHERE thread_id = my_id;