Схемы
Схемы используются для организации объектов базы данных, таких как таблицы, представления и индексы. Вы можете создавать объекты с одинаковыми именами в одной базе данных, но хранить их в разных схемах, чтобы избежать конфликта имен.
Эта статья описывает, как просматривать информацию о схемах, создавать и удалять схемы, а также использовать путь поиска схемы для доступа к объектам.
Обзор
Схема представляет собой логическое объединение объектов внутри одной базы данных. В отличие от баз данных, схемы не являются строго изолированными — пользователи с необходимыми привилегиями могут обращаться к объектам в разных схемах в пределах одной базы данных.
После инициализации кластера Greengage DB доступны несколько схем по умолчанию.
Например, административная схема gp_toolkit позволяет выполнять запросы к системным каталогам, лог-файлам и среде выполнения для получения информации о состоянии системы.
public — схема, в которой по умолчанию создаются новые объекты базы данных.
Вы также можете создавать новые схемы, которые помогают при решении следующих задач:
-
Обеспечение одновременного доступа нескольких пользователей к одной базе данных без конфликтов с использованием личных схем.
-
Организация объектов базы данных в логические группы для упрощения управления, в частности, при настройке прав доступа.
-
Изоляция сторонних приложений для предотвращения конфликтов с именами объектов в различных схемах.
Обратите внимание на то, что схемы не могут быть вложенными.
Схемы по умолчанию
Ниже перечислены схемы, которые создаются в кластере Greengage DB по умолчанию:
-
publicСхема по умолчанию для новых объектов базы данных, если не указана другая схема или не изменен путь поиска схемы. Все роли базы данных имеют привилегии
CREATEиUSAGEдля схемыpublic. Если вы создаете новую схему, необходимо выдать привилегии вашим пользователям для доступа к этой схеме. -
gp_toolkitАдминистративная схема, позволяющая выполнять запросы к системным каталогам, лог-файлам и среде выполнения для получения информации о состоянии системы.
-
pg_catalogСодержит информацию об объектах базы данных: таблицах системного каталога, встроенных типах данных, функциях и операторах. Обратите внимание, что эта схема всегда включена в путь поиска схемы, даже если не указана явно.
-
information_schemaСостоит из стандартизированного набора представлений, содержащих информацию об объектах базы данных. Эти представления получают информацию из таблиц системного каталога в соответствии со стандартом ANSI SQL 2008.
-
pg_aosegХранит служебную информацию о таблицах append-optimized. Схема используется для внутренних нужд СУБД Greengage.
-
pg_bitmapindexХранит служебную информацию о bitmap-индексах. Схема используется для внутренних нужд СУБД Greengage.
-
pg_toastХранит большие объекты, объем которых превышает размер страницы (Oversized-Attribute Storage Technique, TOAST). Схема используется для внутренних нужд СУБД Greengage.
Создание новых схем
Этот раздел показывает, как создавать новые схемы.
Следующие команды создают базу данных books_store и устанавливают подключение к ней:
CREATE DATABASE books_store;
\c books_store
Для создания схем в этой базе данных используйте команду CREATE SCHEMA:
CREATE SCHEMA catalog;
CREATE SCHEMA sales;
При необходимости вы можете добавить комментарии к созданным схемам с помощью команды COMMENT:
COMMENT ON SCHEMA catalog IS 'Schema for storing book metadata';
COMMENT ON SCHEMA sales IS 'Schema for storing sales-related data';
Изменение схем
Чтобы изменить созданные схемы, используйте команду ALTER SCHEMA.
Данная команда создает новую роль:
CREATE ROLE bob WITH LOGIN;
Следующая команда назначает созданную роль владельцем схемы sales:
ALTER SCHEMA sales OWNER TO bob;
Просмотр информации о схемах
Метакоманды psql
В этом разделе описано, как получить информацию о схемах с помощью метакоманд psql.
-
Для просмотра пользовательских схем выполните метакоманду
\dn:\dn+Результат должен выглядеть следующим образом:
List of schemas Name | Owner | Access privileges | Description ------------+---------+--------------------+--------------------------------------- catalog | gpadmin | | Schema for storing book metadata gp_toolkit | gpadmin | gpadmin=UC/gpadmin+| | | =U/gpadmin | public | gpadmin | gpadmin=UC/gpadmin+| standard public schema | | =UC/gpadmin | sales | bob | | Schema for storing sales-related dataСтолбец
Access privilegesдля новых схем пуст, что означает, что привилегии не настроены. Смотрите раздел Роли и привилегии, чтобы узнать, как предоставить пользователям доступ к этим схемам. -
Чтобы увидеть все схемы базы данных, используйте метакоманду
\dnS:\dnS+Результат должен выглядеть следующим образом:
List of schemas Name | Owner | Access privileges | Description --------------------+---------+--------------------+------------------------------------------------------------- catalog | gpadmin | | Schema for storing book metadata gp_toolkit | gpadmin | gpadmin=UC/gpadmin+| | | =U/gpadmin | information_schema | gpadmin | gpadmin=UC/gpadmin+| | | =U/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 | sales | bob | | Schema for storing sales-related data
SQL-команды
Следующие команды показывают, как увидеть информацию о схемах с помощью запросов к системным каталогам.
-
Получить информацию о схемах из таблицы
pg_catalog.pg_namespace:SELECT * FROM pg_catalog.pg_namespace ORDER BY nspname;Результат должен выглядеть следующим образом:
nspname | nspowner | nspacl --------------------+----------+---------------------------------- catalog | 10 | gp_toolkit | 10 | {gpadmin=UC/gpadmin,=U/gpadmin} information_schema | 10 | {gpadmin=UC/gpadmin,=U/gpadmin} pg_aoseg | 10 | pg_bitmapindex | 10 | pg_catalog | 10 | {gpadmin=UC/gpadmin,=U/gpadmin} pg_toast | 10 | public | 10 | {gpadmin=UC/gpadmin,=UC/gpadmin} sales | 57418 | -
Получить информацию о схемах из таблицы
information_schema.schemata: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 --------------+--------------------+--------------+-------------------------------+------------------------------+----------------------------+---------- books_store | catalog | gpadmin | | | | books_store | gp_toolkit | gpadmin | | | | books_store | information_schema | gpadmin | | | | books_store | pg_aoseg | gpadmin | | | | books_store | pg_bitmapindex | gpadmin | | | | books_store | pg_catalog | gpadmin | | | | books_store | pg_toast | gpadmin | | | | books_store | public | gpadmin | | | | books_store | sales | bob | | | |
Путь поиска схемы
Обзор
Greengage DB предоставляет три способа доступа к объектам базы данных:
-
database.schema.object— в этом формате путь к объекту включает имена базы данных и схемы. Данный формат поддерживается для совместимости с ANSI SQL, поскольку можно работать только с одной базой данных одновременно. Если вы используете этот формат для доступа к объекту базы данных, название базы данных должно совпадать с той, к которой вы в данный момент подключены. -
schema.object— в этом формате путь к объекту содержит название схемы. -
object— в этом формате название схемы опускается. Данный синтаксис использует путь поиска схемы (schema search path) для нахождения нужного объекта.
Путь поиска — это упорядоченный список схем, разделенных запятыми, который используется для поиска объектов в том случае, когда схема не указана явно. Объект ищется последовательно в схемах, указанных в списке: сначала в первой, затем во второй, и так далее. Если объект не найден в ни одной из схем, возвращается ошибка.
Ниже приведен пример пути поиска схемы:
catalog, sales, public
В этом случае объект ищется в следующем порядке: catalog → sales → public.
Схема pg_catalog всегда является частью пути поиска схемы, даже если она явно в нем не указана.
Схема, указанная первой в пути поиска, является текущей. Она используется при создании новых объектов в том случае, если схема явно не указана.
Для настройки пути поиска используйте параметр search_path.
Путь поиска схемы можно задать на разных уровнях с приоритетами, применяемыми в следующем порядке — от наименьшего к наибольшему:
-
Глобально (на уровне кластера) с помощью соответствующего параметра конфигурации сервера.
-
На уровне базы данных.
-
Для указанной роли.
-
Во время выполнения, например, в рамках сессии.
Путь поиска по умолчанию
Чтобы узнать текущий путь поиска схемы, используйте команду SHOW:
SHOW search_path;
По умолчанию данная команда возвращает следующее:
search_path ---------------- "$user",public
-
"$user"указывает на схему, название которой совпадает с именем текущего пользователя. Если такая схема не существует, это значение игнорируется. -
public— это предопределенная схема, используемая по умолчанию для вновь создаваемых объектов базы данных.
Чтобы узнать текущую схему, используйте функцию current_schema():
SELECT current_schema();
По умолчанию возвращается public:
current_schema ---------------- public
Это означает, что схемы с именем, совпадающим с именем текущего пользователя, не существует.
Установка пути поиска глобально
Чтобы узнать путь поиска схемы, используемый на уровне кластера, используйте команду gpconfig -s:
$ gpconfig -s search_path
Результат может выглядеть следующим образом:
Values on all segments are consistent GUC : search_path Master value: "$user",public Segment value: "$user",public
Чтобы изменить путь поиска, используйте команду gpconfig -c:
$ gpconfig -c search_path -v '"$user"'
Затем перезагрузите конфигурацию с помощью команды gpstop, чтобы применить изменения:
$ gpstop -u
Установка пути поиска для базы данных
Чтобы задать путь поиска для базы данных, используйте команду ALTER DATABASE:
ALTER DATABASE books_store SET search_path TO catalog, sales, public;
Чтобы применить изменения, переподключитесь к базе данных с помощью метакоманды \c:
\c books_store
Затем проверьте путь поиска с помощью SHOW:
SHOW search_path;
Результат должен выглядеть следующим образом:
search_path ------------------------ catalog, sales, public
Первая схема catalog — это текущая схема, используемая для создания новых объектов.
Создайте новую таблицу books, не указывая имя схемы:
CREATE TABLE books
(
book_id SERIAL
)
DISTRIBUTED BY (book_id);
Создайте таблицу customers с явным указанием схемы sales:
CREATE TABLE sales.customers
(
customer_id SERIAL
)
DISTRIBUTED BY (customer_id);
Проверьте, что для обеих таблиц используются необходимые схемы, с помощью метакоманды \dt:
\dt
Результат должен выглядеть следующим образом:
List of relations Schema | Name | Type | Owner | Storage ---------+-----------+-------+---------+--------- catalog | books | table | gpadmin | heap sales | customers | table | gpadmin | heap
Установка пути поиска для роли
Перед установкой пути поиска схемы создайте роль и выдайте ей привилегию USAGE на схему:
CREATE ROLE alice WITH LOGIN;
GRANT USAGE ON SCHEMA sales TO alice;
Чтобы задать путь поиска схемы для роли, используйте команду ALTER ROLE:
ALTER ROLE alice SET search_path TO sales;
Для применения изменений переподключитесь к базе данных под данной ролью, используя метакоманду \c:
\c books_store alice
Затем проверьте путь поиска с помощью SHOW:
SHOW search_path;
Результат должен выглядеть следующим образом:
search_path ------------- sales
Обратите внимание, что путь поиска роли для alice имеет приоритет над путем поиска для базы данных books_store, который установлен в разделе Установка пути поиска для базы данных.
Изменение пути поиска во время выполнения
Вы можете задать путь поиска схемы во время выполнения с помощью команды SET.
Например, вы можете изменить путь поиска на уровне сессии.
Переподключитесь к базе данных books_store под пользователем gpadmin:
\c books_store gpadmin
Затем используйте команду SET для изменения пути поиска:
SET search_path TO public;
Проверьте результат с помощью команды SHOW:
SHOW search_path;
Вы можете сбросить путь поиска на значение по умолчанию с помощью команды RESET:
RESET search_path;
Если повторно выполнить команду SHOW search_path, вывод должен показать, что путь поиска сброшен на значение, установленное для базы данных books_store:
search_path ------------------------ catalog, sales, public
Удаление схем
По умолчанию схема должна быть пустой, прежде чем ее можно будет удалить. Перед удалением схемы необходимо вручную удалить ее объекты:
DROP TABLE catalog.books;
DROP SCHEMA catalog;
Для удаления схемы и всех содержащихся в ней объектов используйте команду DROP SCHEMA с параметром CASCADE:
DROP SCHEMA sales CASCADE;