pgtt - Модуль управления глобальными временными таблицами
pgtt — это расширение QHB для создания, управления и использования глобальных временных таблиц в стиле Oracle и других СУБД.
Цель этого расширения — предложить возможности для предоставления функции глобальной временной таблицы, ожидающей реализации в ядре. Основной интерес этого расширения состоит в том, чтобы имитировать поведение Oracle с GTT, когда нет возможности переписывать код приложения при переходе на QHB. Во всех остальных случаях лучше всего переписать код для использования стандартных временных таблиц QHB.
Установка
Модуль управления глобальными временными таблицами для QHB поставляется в виде пакета qhb-1.5.1-pgtt.
Подключите репозиторий пакетов QHB и установите пакет расширения для выбранной платформы со страницы загрузки.
Конфигурация
pgtt.enabled
По умолчанию включено. С помощью изменения данного параметра можно включать и отключать расширение. Чтобы отключить расширение, используйте:
SET pgtt.enabled TO off;
Отключить или включить расширение можно в любой момент сеанса.
Использование расширения
Во всех базах данных, где необходимо использовать глобальные временные таблицы, потребуется создать расширение, используя:
CREATE EXTENSION pgtt;
Суперпользователь может загрузить расширение, используя:
LOAD 'pgtt';
Не суперпользователь должен загрузить библиотеку, используя каталог plugins/ следующим образом:
LOAD '$libdir/plugins/pgtt';
Обязательно следуйте приведенным выше инструкциям по установке, чтобы создать символическую ссылку из каталога plugins/ на файл библиотеки расширений.
Расширение pgtt по умолчанию использует выделенную схему для хранения связанных объектов: pgtt_schema. Расширение заботится о том, чтобы эта схема всегда находилась в конце файла search_path.
gtt_testdb=# LOAD '$libdir/plugins/pgtt';
LOAD
gtt_testdb=# SHOW search_path;
search_path
--------------------
public,pgtt_schema
(1 row)
gtt_testdb=# SET search_path TO appschema,public;
SET
gtt_testdb=# SHOW search_path;
search_path
--------------------------------
appschema, public, pgtt_schema
(1 row)
Схема pgtt автоматически добавляется в search_path, когда загружается расширение и если изменяется его search_path позже.
Создание глобальной временной таблицы
Чтобы создать таблицу GTT с именем test_gtt_table, используйте следующий оператор:
CREATE GLOBAL TEMPORARY TABLE test_gtt_table (
id integer,
lbl text
) ON COMMIT { PRESERVE | DELETE } ROWS;
Ключевое слово GLOBAL устарело, но его можно безопасно использовать, единственное, что оно выдаст предупреждение:
WARNING: GLOBAL is deprecated in temporary table creation
Для исключения этого предупреждающего сообщения, допускается использовать GLOBAL как комментарий:
CREATE /*GLOBAL*/ TEMPORARY TABLE test_gtt_table (
LIKE other_table LIKE
INCLUDING DEFAULTS
INCLUDING CONSTRAINTS
INCLUDING INDEXES
) ON COMMIT { PRESERVE | DELETE } ROWS;
расширение обнаружит ключевое слово GLOBAL.
Как видно из приведенного выше примера, поддерживается предложение LIKE, а также предложение AS WITH DATA или WITH NO DATA (по умолчанию):
CREATE /*GLOBAL*/ TEMPORARY TABLE test_gtt_table
AS SELECT * FROM source_table WITH DATA;
В случае WITH DATA расширение заполнит GTT данными, возвращенными из оператора SELECT, только для текущего сеанса.
Предложение временной таблицы QHB ON COMMIT DROP не поддерживается расширением, GTT сохраняются в транзакциях. Если используется предложение, будет вызвана ошибка.
Строки временной таблицы удаляются или сохраняются при фиксации транзакций в соответствии с предложением:
ON COMMIT { PRESERVE | DELETE } ROWS
Удаление глобальной временной таблицы
Чтобы удалить глобальную временную таблицу, выполняются те же действия, что и для обычной таблицы:
DROP TABLE test_gtt_table;
Глобальную временную таблицу можно удалить, даже если она используется другим сеансом.
Создание индексов в глобальной временной таблице
В глобальной временной таблице можно создавать индексы:
CREATE INDEX ON test_gtt_table (id);
так же, как и с любыми другими таблицами.
Ограничения глобальной временной таблицы
D глобальную временную таблицу можно добавить любое ограничение, кроме FOREIGN KEYS.
CREATE GLOBAL TEMPORARY TABLE t2 (
c1 serial PRIMARY KEY,
c2 VARCHAR (50) UNIQUE NOT NULL,
c3 boolean DEFAULT false
)
Использование FOREIGN KEYS в глобальной временной таблице не допускается.
CREATE GLOBAL TEMPORARY TABLE t1 (c1 integer, FOREIGN KEY (c1) REFERENCES source (id));
ERROR: attempt to create referential integrity constraint on global temporary table
ALTER TABLE t2 ADD FOREIGN KEY (c1) REFERENCES source (id);
ERROR: attempt to create referential integrity constraint on global temporary table
Даже если QHB допускает внешние ключи во временной таблице, расширение pgtt пытается максимально имитировать поведение Oracle и других СУБД, таких как DB2, SQL Server или MySQL.
ORA-14455: attempt to create referential integrity constraint on temporary table.
Разделение
Разбиение на разделы в глобальной временной таблице не поддерживается, опять же не потому, что QHB не разрешает разбиение на временные таблицы, а потому, что другие СУБД, такие как Oracle, DB2 и MySQL, не поддерживают его. SQL Server поддерживает разделение глобальной временной таблицы.