Схемы
Обзор
Схема — это логическое объединение сущностей внутри одной базы данных. В отличие от БД, схемы разделены не так жестко: пользователи могут обращаться к нескольким схемам одновременно (при наличии соответствующих прав). Схемы могут быть полезны для решения следующих задач:
-
Организация одновременного доступа нескольких пользователей к одной базе данных.
-
Разбиение базы данных на несколько логических групп. Это может быть особенно полезно при настройке прав доступа к различным объектам БД.
-
Выделение различных схем под сторонние приложения — так, чтобы не возникало конфликтов с именами объектов в различных схемах.
РЕКОМЕНДАЦИЯ
Обратите внимание, что допускается использовать объекты одного и того же типа (например, таблицы) с одинаковым именем в одной БД — при условии, что эти объекты определены в различных схемах.
|
Приведенная ниже таблица описывает схемы, создаваемые по умолчанию в базе данных ADB.
Название | Описание |
---|---|
Хранит настройки ADB и информацию о распределении таблиц и выполненных операциях |
|
diskquota |
Используется ADB-расширением Diskquota. Это расширение предназначено для ограничения дискового пространства, выделяемого под схемы и роли |
gp_toolkit |
Служебная схема, содержащая внешние таблицы, представления и функции, к которым можно обратиться с помощью SQL-команд — для просмотра логов и других системных метрик (включая размеры таблиц, bloat, индексы, ресурсные очереди, spill-файлы и так далее) |
information_schema |
Состоит из стандартизированного набора представлений, содержащих информацию об объектах базы данных. Эти представления извлекают информацию из таблиц системного каталога в соответствии со стандартом ANSI SQL 2008 |
kadb |
Используется в Kafka to ADB Connector |
madlib |
Хранит информацию о функциях библиотеки Apache Madlib |
pg_aoseg |
Хранит служебную информацию о таблицах append-optimized. Схема используется для внутренних нужд СУБД |
pg_bitmapindex |
Хранит служебную информацию о bitmap-индексах. Схема используется для внутренних нужд СУБД |
pg_catalog |
Содержит полную информацию об объектах БД: таблицах системного каталога, встроенных типах данных, функциях и операторах |
pg_toast |
Хранит большие объекты, объем которых превышает размер страницы (TOAST, Oversized-Attribute Storage Technique). Схема используется для внутренних нужд СУБД |
public |
Схема, использумая по умолчанию при создании новых объектов БД — за исключением случаев, когда явно указывается иная схема (или изменено значение schema search path). Все роли (пользователи) имеют привилегии |
ВНИМАНИЕ
Не рекомендуется удалять либо изменять схемы, приведенные выше.
|
Просмотр существующих схем
Для получения списка схем в текущем ADB-кластере необходимо выполнить следующие шаги:
-
Подключиться к Master-серверу ADB (например, через SSH) под пользователем
gpadmin
, который создается по умолчанию:$ sudo su - gpadmin
-
Подключиться к БД через psql (или иную клиентскую программу):
$ psql adb
Результат команды:
psql (9.4.24) Type "help" for help.
-
Выполнить одну из следующих команд:
-
Сделать выборку из таблицы
pg_catalog.pg_namespace
, содержащей данные обо всех схемах БД.SELECT * FROM pg_catalog.pg_namespace ORDER BY nspname;
Результат команды:
nspname | nspowner | nspacl --------------------+----------+---------------------------------- arenadata_toolkit | 10 | {gpadmin=UC/gpadmin} diskquota | 10 | gp_toolkit | 10 | {gpadmin=UC/gpadmin,=U/gpadmin} information_schema | 10 | {gpadmin=UC/gpadmin,=U/gpadmin} kadb | 10 | madlib | 10 | pg_aoseg | 10 | pg_bitmapindex | 10 | pg_catalog | 10 | {gpadmin=UC/gpadmin,=U/gpadmin} pg_toast | 10 | public | 10 | {gpadmin=UC/gpadmin,=UC/gpadmin} (11 rows)
-
Сделать выборку из таблицы
information_schema.schemata
. По сравнению сpg_catalog.pg_namespace
, эта таблица хранит данные о схемах БД в соответствии со стандартом ANSI SQL 2008.SELECT * FROM information_schema.schemata ORDER BY schema_name;
Результат команды:
catalog_name | schema_name | schema_owner | default_character_set_catalog | default_character_set_schema | default_character_set_name | sql_path --------------+--------------------+--------------+-------------------------------+------------------------------+----------------------------+---------- adb | arenadata_toolkit | gpadmin | | | | adb | diskquota | gpadmin | | | | adb | gp_toolkit | gpadmin | | | | adb | information_schema | gpadmin | | | | adb | kadb | gpadmin | | | | adb | madlib | gpadmin | | | | adb | pg_aoseg | gpadmin | | | | adb | pg_bitmapindex | gpadmin | | | | adb | pg_catalog | gpadmin | | | | adb | pg_toast | gpadmin | | | | adb | public | gpadmin | | | | (11 rows)
-
При работе с терминальным клиентом psql для вывода списка схем БД можно воспользоваться мета-командой
\dnS+
.\dnS+
Результат команды:
List of schemas Name | Owner | Access privileges | Description --------------------+---------+--------------------+------------------------------------------------------------- arenadata_toolkit | gpadmin | gpadmin=UC/gpadmin | diskquota | gpadmin | | gp_toolkit | gpadmin | gpadmin=UC/gpadmin+| | | =U/gpadmin | information_schema | gpadmin | gpadmin=UC/gpadmin+| | | =U/gpadmin | kadb | gpadmin | | madlib | gpadmin | | pg_aoseg | gpadmin | | Reserved schema for Append Only segment list and eof tables pg_bitmapindex | gpadmin | | Reserved schema for internal relations of bitmap indexes pg_catalog | gpadmin | gpadmin=UC/gpadmin+| system catalog schema | | =U/gpadmin | pg_toast | gpadmin | | reserved schema for TOAST tables public | gpadmin | gpadmin=UC/gpadmin+| standard public schema | | =UC/gpadmin | (11 rows)
-
Создание схемы
Чтобы создать новую схему базы данных, необходимо использовать команду CREATE SCHEMA
и затем указать имя схемы.
В следующем примере создается новая схема test_schema
(в текущей базе данных adb
).
CREATE SCHEMA test_schema;
Результат команды:
CREATE SCHEMA
Если теперь воспользоваться любой из команд для вывода списка схем БД, результат будет следующим:
adb=# \dnS+ List of schemas Name | Owner | Access privileges | Description --------------------+---------+--------------------+------------------------------------------------------------- arenadata_toolkit | gpadmin | gpadmin=UC/gpadmin | diskquota | gpadmin | | gp_toolkit | gpadmin | gpadmin=UC/gpadmin+| | | =U/gpadmin | information_schema | gpadmin | gpadmin=UC/gpadmin+| | | =U/gpadmin | kadb | gpadmin | | madlib | gpadmin | | pg_aoseg | gpadmin | | Reserved schema for Append Only segment list and eof tables pg_bitmapindex | gpadmin | | Reserved schema for internal relations of bitmap indexes pg_catalog | gpadmin | gpadmin=UC/gpadmin+| system catalog schema | | =U/gpadmin | pg_toast | gpadmin | | reserved schema for TOAST tables public | gpadmin | gpadmin=UC/gpadmin+| standard public schema | | =UC/gpadmin | test_schema | gpadmin | | (12 rows)
Schema search path
Для доступа к объектам БД можно использовать две основные формы записи имен: соответствующую ASCII-стандарту запись database.schema.object
или более короткий вариант schema.object
. Вторая форма предпочтительна, поскольку в рамках одного соединения можно обращаться лишь к одной БД. Но существует также третий вариант записи, который не требует явного указания имени схемы и позволяет оперировать лишь именами объектов (например, именами таблиц). Это возможно благодаря использованию пути для поиска схем — schema search path.
Путь schema search path настраивается через параметр search_path
. Этот параметр определяет порядок, в котором будут просматриваться существующие схемы при поиске объектов БД. Фактически он представляет собой список схем, разделенных запятыми. Запрашиваемый объект БД ищется в первой схеме списка, в случае неудачного поиска — во второй схеме, и так далее. Если объект БД не найден ни в одной из схем списка, возвращается ошибка — даже в случае если объект присутствует в других схемах БД. Первая схема в списке является схемой по умолчанию — default-схемой (ее также называют current-схемой). Это не только первая схема, в которой выполняется поиск, но и схема, в которой создаются новые объекты БД, если имя схемы для них явно не определено.
Для вывода текущего значения пути schema search path можно использовать следующую команду:
SHOW search_path;
По умолчанию команда возвращает следующее значение:
search_path ----------------- "$user", public (1 row)
Первый элемент списка "$user"
указывает на схему с тем же названием, что имя текущего пользователя. При отсутствии схемы это значение игнорируется. Второй элемент списка указывает на схему public
. Именно по этой причине схема public
используется для всех новых объектов БД по умолчанию. Для вывода схемы default (или current) можно использовать следующий запрос:
SELECT current_schema();
По умолчанию команда возвращает следующее значение:
current_schema ---------------- public (1 row)
ПРИМЕЧАНИЕ
Схема pg_catalog всегда является частью пути schema search path, даже если она явно в нем не указана.
|
Изменение параметра search_path
Изменение параметра search_path
возможно на уровне базы данных (через SQL-команду ALTER DATABASE
) и на уровне роли (через SQL-команду ALTER ROLE
). Ниже приведена последовательность шагов для первого метода:
-
Изменить значение параметра
search_path
на уровне базы данных.ALTER DATABASE adb SET search_path TO test_schema,public;
Результат команды:
ALTER DATABASE
-
Выйти из psql (или любого иного используемого клиента) — чтобы перезапустить клиентскую сессию.
\q
-
Повторно покдлючиться к базе данных
adb
.$ psql adb
Результат команды:
psql (9.4.24) Type "help" for help.
-
Создать любую таблицу без явного указания схемы.
CREATE TABLE test(id1 INT) DISTRIBUTED BY(id1);
Результат команды:
CREATE TABLE
-
Вывести схему, в которой создана таблица
test
.\dt test
Убедиться, что это схема
test_schema
, а неpublic
.List of relations Schema | Name | Type | Owner | Storage -------------+------+-------+---------+--------- test_schema | test | table | gpadmin | heap (1 row)
-
Вернуть исходное значение параметра
search_path
и повторно перезапустить клиентскую сессию.adb=# ALTER DATABASE adb SET search_path TO "$user",public; ALTER DATABASE adb=# \q
ПРИМЕЧАНИЕ
Изменить значение |