Перейти к основному содержимому

Расширения

В этом разделе мы рассмотрим механизм расширений в PostgreSQL на примере СУБД Pangolin – какие расширения доступны, как ими управлять, а также как использовать объекты, поставляемые с расширениями.

Расширяемость​

Удобной особенностью PostgreSQL является его расширяемость, достигаемая за счет гибкости системного каталога. Поскольку системный каталог представлен таблицами и представлениями, его содержимое можно модифицировать. Именно это позволяет пользователям:

  • создавать собственные функции;
  • добавлять языки программирования для кода на стороне сервера;
  • создавать новые специализированные типы данных;
  • создавать способы доступа к данным;
  • создавать новые типы данных, операторы и соответствующие типы индексов;
  • создавать способы подключения к внешним источникам данных.

Обычно работа, связанная с расширением возможностей PostgreSQL, выливается в конечном итоге в появление расширения (extension). Расширение включает в себя группу логически связанных объектов (таблиц, функций, представлений, типов и так далее), упакованных в единое целое.

Наиболее важные расширения поставляются вместе с исходным кодом PostgreSQL в каталоге contrib.

Доступные расширения​

Узнаем, сколько расширений доступно для установки в текущей системе:

postgres@postgres=# SELECT count(*) FROM pg_available_extensions;
count
-------
83
(1 row)

Представление pg_catalog.pg_available_extensions содержит список доступных к установке расширений. В нем можно получить информацию о версии расширения по умолчанию и о текущей установленной версии.

Найдем расширения, связанные с Oracle-совместимостью:

postgres@postgres=# SELECT name, comment FROM pg_available_extensions WHERE name ~ 'ora';
name | comment
------------+-----------------------------------------------------------------------------------------------
orafce | Functions and operators that emulate a subset of functions and packages from the Oracle RDBMS
oracle_fdw | foreign data wrapper for Oracle access
(2 rows)

Имеется расширение для подключения к Oracle RDBMS oracle_fdw (FDW — Foreign Data Wrapper) и расширение orafce с популярными функциями из Oracle RDBMS.

Множество востребованных расширений поставляются непосредственно в установочном пакете СУБД Pangolin. Каталог, в который файлы расширений установлены и доступны для СУБД, можно узнать следующим образом:

[postgres@ServerName ~]$ pg_config --sharedir
/usr/pangolin-{pangolin-version}/share

Физически файлы расширений находятся в подкаталоге extension этого каталога.

Доступные версии расширений​

У каждого расширения есть версия по умолчанию, которая будет установлена, если не указать другую явно. Версию по умолчанию показывает поле default_version представления pg_available_extensions:

postgres@postgres=# SELECT name, default_version FROM pg_available_extensions WHERE name ~ 'hint';
name | default_version
--------------+-----------------
pg_hint_plan | 1.5
(1 row)

Расширение pg_hint_plan по умолчанию устанавливается в версии 1.5.

Все доступные к установке версии выдает представление pg_available_extension_versions:

postgres@postgres=# SELECT name, version, requires FROM pg_available_extension_versions WHERE name ~ 'hint';
name | version | requires
--------------+---------+----------
pg_hint_plan | 1.3.0 |
pg_hint_plan | 1.3.1 |
pg_hint_plan | 1.3.2 |
pg_hint_plan | 1.3.6 |
pg_hint_plan | 1.3.7 |
pg_hint_plan | 1.4.1 |
pg_hint_plan | 1.5 |
pg_hint_plan | 1.3.3 |
pg_hint_plan | 1.3.5 |
pg_hint_plan | 1.3.4 |
pg_hint_plan | 1.3.8 |
pg_hint_plan | 1.4 |
(12 rows)

Некоторые расширения бывают доступны сразу в нескольких версиях. Например, в версии СУБД Pangolin из примера, расширение pg_hint_plan поставляется сразу в нескольких версиях. У каждого расширения обязательно имеется управляющий файл с расширением control. Версия по умолчанию указана в нем:

[postgres@ServerName ~]$ cat /usr/pangolin-{pangolin-version}/share/extension/pg_hint_plan.control
# pg_hint_plan extension
comment = ''
default_version = '1.5'
relocatable = false
schema = hint_plan

При установке расширения можно указать требуемую версию. Также если доступна к установке более свежая версия, то установленную старую версию можно обновить.

Установка расширения​

Подключимся к базе данных student и посмотрим, какие расширения уже установленны:

postgres@postgres=# \c student
Вы подключены к базе данных "student" как пользователь "postgres".
postgres@student=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
plpgsql | 1.1 | pg_catalog | PL/pgSQL procedural language
(1 row)

После установки расширения его видно в списке, выводимом \dx. Расширение plpgsql — это язык PL/pgSQL, которое подключается автоматически.

Установка расширения осуществляется командой CREATE EXTENSION, в результате которой объекты, упакованные в расширение, становятся доступными в текущей базе данных. Без явного указания требуемой версии расширения устанавливается версия по умолчанию.

Установим расширение orafce:

postgres@student=# CREATE EXTENSION orafce;
CREATE EXTENSION
postgres@student=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+-----------------------------------------------------------------------------------------------
orafce | 4.4 | public | Functions and operators that emulate a subset of functions and packages from the Oracle RDBMS
plpgsql | 1.1 | pg_catalog | PL/pgSQL procedural language
(2 rows)

Для получения списка объектов, установленных из расширения, удобно использовать \dx+ (показана часть списка, так как из этого расширения установлено 682 объекта):

postgres@student=# \dx+ orafce
...
view oracle.user_cons_columns
view oracle.user_constraints
view oracle.user_ind_columns
view oracle.user_objects
view oracle.user_procedures
view oracle.user_source
view oracle.user_tab_columns
view oracle.user_tables
view oracle.user_views
(682 rows)

Использование объектов расширения​

После установки расширения его объекты можно использовать как обычные объекты базы данных. Например, запросим данные из представления oracle.user_tables:

postgres@student=# SELECT * FROM oracle.user_tables LIMIT 10;
table_name
-----------------------
tablo
pg_statistic_ext_data
pg_type
pg_attribute
utl_file_dir
pg_user_mapping
psql_grace_authid
pg_authid
pg_statistic
pg_proc
(10 rows)

Из расширения могут быть установлены схемы. В примере из расширения установлена схема oracle, один из объектов в которой — представление user_tables.

Из расширений часто устанавливаются схемы, которым будут принадлежать другие объекты, установленные из расширения. Так, например, из расширения orafce были установлены следующие схемы:

postgres@student=# \dn
Список схем
Имя | Владелец
--------------+-------------------
dbms_alert | postgres
dbms_assert | postgres
dbms_output | postgres
dbms_pipe | postgres
dbms_random | postgres
dbms_sql | postgres
dbms_utility | postgres
oracle | postgres
plunit | postgres
plvchr | postgres
plvdate | postgres
plvlex | postgres
plvstr | postgres
plvsubst | postgres
public | pg_database_owner
utl_file | postgres
(16 rows)

Удаление расширений​

Установка расширения подключает его к текущей базе, и все объекты, упакованные в расширение, становятся доступными в каких-либо схемах этой базы.

Удалить командой DROP объект, упакованный в расширение, нельзя, так как с помощью механизма зависимостей выяснится, что расширение зависит от этого объекта. Например, попробуем удалить представление oracle.user_tables отдельно:

postgres@student=# DROP VIEW oracle.user_tables;
ERROR: cannot drop view oracle.user_tables because extension orafce requires it
HINT: You can drop extension orafce instead.

Объекты расширения будут удалены из текущей базы данных лишь тогда, когда будет удалено само расширение командой DROP EXTENSION:

postgres@student=# DROP EXTENSION orafce;
DROP EXTENSION
postgres@student=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
plpgsql | 1.1 | pg_catalog | PL/pgSQL procedural language
(1 row)
Примечание

При этом, возможна ситуация, когда в базе после установки расширения были созданы новые объекты, использующие объекты расширения. Например, в подключенном расширении имеется некоторый тип данных и этот тип использован для столбцов некоторых таблиц. Тогда команда DROP EXTENSION не выполнится успешно и будет получено сообщение о нарушении зависимости.

Можно использовать DROP EXTENSION ... CASCADE, но при этом из базы данных будут удалены зависимые от этого расширения объекты.