ALTER SYSTEM
ALTER TABLE
CREATE TABLE
DROP TABLE
CREATE INDEX CONCURRENTLY
UPDATE
INSERT ON CONFLICT DO UPDATE
ALTER SCHEMA
DROP SERVER
CREATE COLLATION
В целях обеспечения согласованности сегментированной базы данных, Shardman ограничивает возможности некоторых выполняемых SQL-команд.
ALTER SYSTEM
ALTER SYSTEM
запрещена (изменение конфигурации должно выполняться через shardmanctl config update
).
ALTER TABLE
Команда ALTER TABLE
запрещена для секций сегментированных таблиц.
Все формы команды ALTER TABLE
запрещены для сегментированных или глобальных таблиц, за исключением следующих:
Команда ALTER TABLE OWNER
разрешена. Для сегментированной таблицы эта команда также меняет владельца секций таблицы. Только глобальный пользователь может быть владельцем сегментированной или глобальной таблицы.
Для команды ALTER TABLE COLUMN TYPE
существуют следующие ограничения. Нельзя изменить тип столбца сегментированной таблицы, участвующего в сегментировании или ключе секционирования. Нельзя изменить тип столбца сегментированной таблицы с помощью предложения USING
(но это разрешено для глобальных таблиц). Кроме того, на данный момент пользователь должен самостоятельно создавать и поддерживать точное равенство новых типов на каждом узле кластера.
Разрешена команда ALTER TABLE COLUMN RENAME
.
Допускается добавление или удаление уникальных ограничений и проверок для всей таблицы. Для глобальных таблиц запрещено удаление ограничения первичного ключа или удаление столбцов, являющихся частью первичного ключа.
Добавление внешних ключей между сегментированными таблицами возможно только в том случае, если они размещены совместно и внешний ключ ссылается на кортежи, которые хранятся в той же группе репликации. Внешний ключ между сегментированными таблицами должен начинаться со столбцов, используемых для секционирования в обеих таблицах. Внешний ключ в глобальной таблице может ссылаться только на другую глобальную таблицу. Внешний ключ в сегментированной таблице может ссылаться на совмещённую сегментированную таблицу или глобальную таблицу.
Разрешены действия SET
/DROP NOT NULL
.
Задание параметров хранения разрешено для глобальных таблиц.
CREATE TABLE
Применяются те же ограничения, что и для команды ALTER TABLE
.
Использование невстроенных типов (типов со значениями OID >= 10000) или небазовых типов или массивов в столбцах «distributed_by» запрещено.
Только глобальный пользователь может создавать сегментированные или глобальные таблицы.
Использование ограничений DEFERRABLE
для глобальных таблиц запрещено.
В совмещённой таблице количество и типы столбцов, используемых для секционирования таблицы, должны быть такими же, как и в таблице для совместного размещения.
Нельзя создать временную сегментированную или глобальную таблицу.
Следующие ограничения применяются к таблицам, созданным с помощью LIKE
исходная_таблица
, где исходная_таблица
является локальной:
Копирование без предложения вариант_копирования
или с INCLUDING INDEXES
поддерживается.
С помощью INCLUDING INDEXES
копируются только уникальные индексы и индексы с поддержкой первичного ключа отношения.
Копирование индексов для столбцов не поддерживается.
Использование ограничений EXCLUDE
не поддерживается.
У локальных таблиц в команде CREATE TABLE LIKE
должны быть только столбцы базовых типов.
Частичные индексы не поддерживаются.
Поддерживаются только стандартные правила сортировки.
Ограничение по NULLS NOT DISTINCT
не поддерживается.
DROP TABLE
Сегментированные или глобальные таблицы и локальные таблицы нельзя удалять одновременно в одном операторе.
Нельзя удалять секции сегментированной таблицы.
CREATE INDEX CONCURRENTLY
CREATE INDEX CONCURRENTLY
— это нетранзакционная команда. Если при построении индекса для сегментированной или глобальной таблицы возникает проблема, такая как сбой сети, взаимоблокировка или нарушение уникальности в уникальном индексе, CREATE INDEX CONCURRENTLY
выполнится частично неверно, но может оставить после себя рабочие или нерабочие индексы в узлах кластера Shardman. Также в некоторых узлах может полностью отсутствовать индекс. В последнем случае команда DROP INDEX
не будет работать. Рекомендуемый способ удаления такого индекса для всего кластера — использовать команду DROP INDEX IF EXISTS
. Обратите внимание, что DROP INDEX CONCURRENTLY
не поддерживается для сегментированных таблиц, поэтому эту операцию лучше выполнять в период обслуживания.
UPDATE
Команда UPDATE
для сегментированной таблицы выполняется как серия обычных команд UPDATE, если она не перемещает данные между секциями или подсекциями. В противном случае она выполняется внутри как удаление (DELETE
) из одной секции и вставка (INSERT
) в другую (так называемую целевую секцию). Если секция, в которую UPDATE
добавляет данные (INSERT), изменяется в том же операторе, возникнет ошибка. На практике это означает, что если UPDATE
перемещает данные между секциями, нужно явно исключить целевую секцию из изменения в предложении WHERE
оператора.
INSERT ON CONFLICT DO UPDATE
Команда INSERT INTO
не поддерживается для сторонних таблиц, когда conflict_target это имя_таблицы
... ON CONFLICT [conflict_target] conflict_action [WHERE condition]DO UPDATE
. Поддерживается для сегментированных таблиц, если выражения в предложениях SET
и WHERE
могут быть безопасно разобраны (в настоящее время разбор sqlvalue-функций, параметров и подзапросов внутри этих предложений не поддерживается) и если нечастичный уникальный индекс, содержащий только столбцы таблицы (но не выражения на основе столбцов), соответствует выражению conflict_target. Обычно этим критериям соответствует первичный ключ таблицы.
Глобальных пользователей может создавать только пользователь с разрешением CREATEROLE
на всех узлах кластера.
Глобальные роли не могут быть переименованы.
Глобальные и локальные роли нельзя удалить одновременно в одном операторе.
GRANT
для локальной и глобальной роли в одном операторе запрещён.
REVOKE
от локальной и глобальной роли в одном операторе запрещён.
ALTER SCHEMA
Схемы, содержащие глобальные или сегментированные таблицы, нельзя переименовывать. Служебные схемы Shardman (shardman
и shardman_internal
) нельзя переименовывать или удалять.
DROP SERVER
Серверы кластера Shardman не могут быть удалены. Используйте инструменты Shardman для удаления серверов из кластера.
Работа с пользовательскими базами данных не поддерживается. В ходе работы shardmanctl все локальные пользовательские базы данных могут быть повреждены или потеряны.
CREATE COLLATION
Если используются пользовательские правила сортировки, на всех серверах должна быть установлена одна и та же версия icu. В противном случае результаты запросов к сегментированным таблицам могут быть некорректными.
Команда DROP TYPE CASCADE
запрещена, если она влияет на типы, используемые в глобальных или сегментированных таблицах.