PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

segurança de thread postgresql para tabelas temporárias


As tabelas temporárias são visíveis para todas as operações na mesma sessão. Então você não pode crie uma tabela temporária com o mesmo nome na mesma sessão antes de descartar o que existe (confirme a transação no seu caso).

Você pode querer usar:
CREATE TEMP TABLE tmptbl IF NOT EXISTS ...

Mais sobre CREATE TABLE no manual.

Tabelas temporárias exclusivas


Para tornar a tabela temporária local por "thread" (na mesma sessão), você precisa usar nomes de tabela exclusivos . Uma maneira seria usar uma SEQUENCE não vinculada e SQL dinâmico - em uma linguagem procedural como plpgsql ou em uma instrução DO (que é basicamente a mesma sem armazenar uma função.

Execute um:
CREATE SEQUENCE myseq;

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

Para saber o nome da tabela mais recente:
SELECT 'tmp' || currval('myseq');

Ou coloque tudo em uma função plpgsql e retorne a tabela ou reutilize o nome da tabela.

Todos os comandos SQL adicionais devem ser executados dinamicamente, pois as instruções SQL simples operam com identificadores codificados. Então, provavelmente é melhor colocar tudo em uma função plpgsql.

ID exclusivo para usar a mesma tabela temporária


Outra solução possível poderia ser usar a mesma tabela temporária para todos os threads na mesma sessão e adicione uma coluna thread_id para a mesa. Certifique-se de indexar a coluna, se você fizer uso intenso do recurso. Em seguida, use um thread_id exclusivo por thread (na mesma sessão).

Apenas uma vez:
CREATE SEQUENCE myseq;

Uma vez por fio:
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;