PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

postgresql безопасност на нишките за временни таблици

Временните таблици са видими за всички операции в една и съща сесия. Така че виене можете създайте временна таблица със същото имев същата сесия преди да махнете съществуващия (завършете транзакцията във вашия случай).

Може да искате да използвате:

CREATE TEMP TABLE tmptbl IF NOT EXISTS ...

Повече за CREATE TABLE в ръководството.

Уникални времеви таблици

За да направите временната таблица локална за "нишка" (в същата сесия), трябва да използвате уникални имена на таблици . Един от начините би бил да се използва необвързан SEQUENCE и динамичен SQL - на процедурен език като plpgsql или в оператор DO (което по същество е същото, без да се съхранява функция.

Изпълнете едно:

CREATE SEQUENCE myseq;

Използвайте:

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

За да знаете последното име на таблица:

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

Или поставете всичко във функция plpgsql и върнете таблицата или използвайте повторно името на таблицата.

Всички следващи SQL команди трябва да се изпълняват динамично, тъй като обикновените SQL изрази работят с твърдо кодирани идентификатори. Така че вероятно е най-добре да поставите всичко във функция plpgsql.

Уникален идентификатор за използване на същата временна таблица

Друго възможно решение може да бъде използването на същата времева таблица за всички нишки в една и съща сесия и добавете колона thread_id до масата. Не забравяйте да индексирате колоната, ако използвате интензивно функцията. След това използвайте уникален thread_id на нишка (в същата сесия).

Само веднъж:

CREATE SEQUENCE myseq;

Веднъж на нишка:

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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Java Crosstab - заявка за подготвени декларации

  2. Автоматизиране на одитите на сигурността за PostgreSQL

  3. Защо PostgreSQL не харесва имената на таблици с ГОЛИНИ РЕГИСТРИ?

  4. Тригер срещу ограничение за проверка

  5. Как да нулирате последователността в postgres и да попълните колоната за идентификатор с нови данни?