Схемы
Обзор
Схема — это логическое объединение сущностей внутри одной базы данных. В отличие от БД, схемы разделены не так жестко: пользователи могут обращаться к нескольким схемам одновременно (при наличии соответствующих прав). Схемы могут быть полезны для решения следующих задач:
-
Организация одновременного доступа нескольких пользователей к одной базе данных.
-
Разбиение базы данных на несколько логических групп. Это может быть особенно полезно при настройке прав доступа к различным объектам БД.
-
Выделение различных схем под сторонние приложения — так, чтобы не возникало конфликтов с именами объектов в различных схемах.
|
РЕКОМЕНДАЦИЯ
Обратите внимание, что допускается использовать объекты одного и того же типа (например, таблицы) с одинаковым именем в одной БД — при условии, что эти объекты определены в различных схемах.
|
Приведенная ниже таблица описывает схемы, создаваемые по умолчанию в базе данных ADB.
| Название | Описание |
|---|---|
Хранит настройки ADB и информацию о распределении таблиц и выполненных операциях |
|
diskquota |
Используется ADB-расширением |
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 |
Хранит большие объекты, объем которых превышает размер страницы (Oversized-Attribute Storage Technique, TOAST). Схема используется для внутренних нужд СУБД |
public |
Схема, используемая по умолчанию при создании новых объектов БД — за исключением случаев, когда явно указывается иная схема (или изменено значение пути поиска схемы). Все роли (пользователи) имеют привилегии |
|
ВНИМАНИЕ
Не рекомендуется удалять либо изменять схемы, приведенные выше.
|
Просмотр существующих схем
Для получения списка схем в текущем ADB-кластере выполните следующие шаги:
-
Подключитесь к мастер-хосту 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
Если теперь воспользоваться любой из команд для вывода списка схем БД, результат будет следующим:
\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)
Путь поиска схемы
Для доступа к объектам БД можно использовать две основные формы записи имен: соответствующую ANSI-стандарту запись database.schema.object или более короткий вариант schema.object. Вторая форма предпочтительна, поскольку в рамках одного соединения можно обращаться лишь к одной БД. Но существует также третий вариант записи, который не требует явного указания имени схемы и позволяет оперировать лишь именами объектов (например, именами таблиц). Это возможно благодаря использованию пути поиска схемы (schema search path).
Путь поиска схемы настраивается через параметр search_path. Этот параметр определяет порядок, в котором будут просматриваться существующие схемы при поиске объектов БД. Фактически он представляет собой список схем, разделенных запятыми. Запрашиваемый объект БД ищется в первой схеме списка, в случае неудачного поиска — во второй схеме, и так далее. Если объект БД не найден ни в одной из схем списка, возвращается ошибка — даже в случае если объект присутствует в других схемах БД. Первая схема в списке является схемой по умолчанию — default-схемой (ее также называют current-схемой). Это не только первая схема, в которой выполняется поиск, но и схема, в которой создаются новые объекты БД, если имя схемы для них явно не определено.
Для вывода текущего значения пути поиска схемы можно использовать следующую команду:
SHOW search_path;
По умолчанию команда возвращает следующее значение:
search_path ----------------- "$user", public (1 row)
Первый элемент списка "$user" указывает на схему с тем же названием, что имя текущего пользователя. При отсутствии схемы это значение игнорируется. Второй элемент списка указывает на схему public. Именно по этой причине схема public используется для всех новых объектов БД по умолчанию. Для вывода схемы default (или current) можно использовать следующий запрос:
SELECT current_schema();
По умолчанию команда возвращает следующее значение:
current_schema ---------------- public (1 row)
|
ПРИМЕЧАНИЕ
Схема pg_catalog всегда является частью пути поиска схемы, даже если она явно в нем не указана.
|
Изменение параметра 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и повторно перезапустите клиентскую сессию.ALTER DATABASE adb SET search_path TO "$user",public; \q
|
ПРИМЕЧАНИЕ
Изменить значение |